GVKun编程网logo

Spring Boot 测试 - 使用 test application.yaml 时 @Value 为空(springboottest 引入yml)

19

以上就是给各位分享SpringBoot测试-使用testapplication.yaml时@Value为空,其中也会对springboottest引入yml进行解释,同时本文还将给你拓展Externa

以上就是给各位分享Spring Boot 测试 - 使用 test application.yaml 时 @Value 为空,其中也会对springboottest 引入yml进行解释,同时本文还将给你拓展Externalizing Session State for a Spring Boot Application Using Spring-Session、IDEA开发spring boot应用时 application.yml 或 application.properties 自定义属性提示、java – 自从迁移到Spring Boot 1.1.4.RELEASE之后,发生@Value和application.properties问题、Spring Boot application.yml application.properties 优先级等相关知识,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

Spring Boot 测试 - 使用 test application.yaml 时 @Value 为空(springboottest 引入yml)

Spring Boot 测试 - 使用 test application.yaml 时 @Value 为空(springboottest 引入yml)

如何解决Spring Boot 测试 - 使用 test application.yaml 时 @Value 为空?

我正在尝试运行带有测试值的单元测试 application.yaml 文件,但我的 @Value 变量中仍然收到 null 值。

@RunWith(springrunner.class)
@SpringBoottest
@ContextConfiguration(classes = { SpringBatchConfiguration.class })
public class WebServiceReaderTest {

    //some mock services here

    @InjectMocks
    private CustomWebServiceReader reader;

    private JobParameters jobParameters;

    @Test
    public void readertest() throws Exception {
        StepExecution stepExecution = MetaDataInstanceFactory
                .createStepExecution(jobParameters);

        StepScopeTestUtils.doInStepScope(stepExecution,() -> reader.read());
    }

}

SpringBatchConfiguration.class

@Configuration
@EnableAutoConfiguration
@EnableBatchProcessing
public class SpringBatchConfiguration extends DefaultBatchConfigurer {

    @Override
    public void setDataSource(DataSource dataSource) {
        // leave empty,so the spring batch will not use database,but a Map
    }
}

在我的 Reader 类中,我正在从属性文件中读取值。

@Value("${data-import.threshold}")
private Long threshold;

我在 src/test/resources 文件夹中有我的 application.yaml 文件

data-import:
    threshold: 10

我使用的是 Spring Boot 2.4.4wiremock 2.27.2

我试过使用

@ContextConfiguration(classes = { SpringBatchConfiguration.class },initializers=
        ConfigDataApplicationContextinitializer.class)
@ContextConfiguration(classes = { SpringBatchConfiguration.class },initializers=
        ConfigFileApplicationContextinitializer.class)
@TestPropertySource(locations = { "classpath:application.yaml" })

但这些都没有用。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

Externalizing Session State for a Spring Boot Application Using Spring-Session

Externalizing Session State for a Spring Boot Application Using Spring-Session

Spring-session is a very cool new project that aims to provide a simpler way of managing sessions in Java based web applications. One of the features that I explored with spring-session recently was the way it supports externalizing session state without needing to fiddle with the internals of specific web containers like Tomcat or Jetty.

To test spring-session I have used a shopping cart type application(available here) which makes heavy use of session by keeping the items added to the cart as a session attribute, as can be seen from these screenshots:

输入图片说明

输入图片说明

Consider first a scenario without Spring session. So this is how I have exposed my application:

输入图片说明

I am using nginx to load balance across two instances of this application. This set-up is very easy to run using Spring boot, I brought up two instances of the app up using two different server ports, this way:

mvn spring-boot:run -Dserver.port=8080
mvn spring-boot:run -Dserver.port=8082

and this is my nginx.conf to load balance across these two instances:

events {
    worker_connections  1024;
}
http {
    upstream sessionApp {
        server localhost:8080;
        server localhost:8082;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://sessionApp;
        }       
    }
}

I display the port number of the application in the footer just to show which instance is handling the request.

If I were to do nothing to move the state of the session out the application then the behavior of the application would be erratic as the session established on one instance of the application would not be recognized by the other instance - specifically if Tomcat receives a session id it does not recognize then the behavior is to create a new session.

Introducing Spring session into the application

There are container specific ways to introduce a external session stores - One example is here, where Redis is configured as a store for Tomcat. Pivotal Gemfire provides a module to externalize Tomcat''s session state.

The advantage of using Spring-session is that there is no dependence on the container at all - maintaining session state becomes an application concern. The instructions on configuring an application to use Spring session is detailed very well at the Spring-session site, just to quickly summarize how I have configured my Spring Boot application, these are first the dependencies that I have pulled in:

<dependency>
 <groupId>org.springframework.session</groupId>
 <artifactId>spring-session</artifactId>
 <version>1.0.0.BUILD-SNAPSHOT</version>
</dependency>
<dependency>
 <groupId>org.springframework.session</groupId>
 <artifactId>spring-session-data-redis</artifactId>
 <version>1.0.0.BUILD-SNAPSHOT</version>
</dependency>
<dependency>
 <groupId>org.springframework.data</groupId>
 <artifactId>spring-data-redis</artifactId>
 <version>1.4.1.RELEASE</version>
</dependency>
<dependency>
 <groupId>redis.clients</groupId>
 <artifactId>jedis</artifactId>
 <version>2.4.1</version>
</dependency>

and my configuration to use Spring-session for session support, note the Spring Boot specific FilterRegistrationBean which is used to register the session repository filter:

import org.springframework.boot.context.embedded.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
import org.springframework.session.web.http.SessionRepositoryFilter;
import org.springframework.web.filter.DelegatingFilterProxy;

import java.util.Arrays;

@Configuration
@EnableRedisHttpSession
public class SessionRepositoryConfig {

 @Bean
 @Order(value = 0)
 public FilterRegistrationBean sessionRepositoryFilterRegistration(SessionRepositoryFilter springSessionRepositoryFilter) {
  FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
  filterRegistrationBean.setFilter(new DelegatingFilterProxy(springSessionRepositoryFilter));
  filterRegistrationBean.setUrlPatterns(Arrays.asList("/*"));
  return filterRegistrationBean;
 }

 @Bean
 public JedisConnectionFactory connectionFactory() {
  return new JedisConnectionFactory();
 }
}

And that is it! magically now all session is handled by Spring-session, and neatly externalized to Redis.

If I were to retry my previous configuration of using nginx to load balance two different Spring-Boot applications using the common Redis store, the application just works irrespective of the instance handling the request. I look forward to further enhancements to this excellent new project.

The sample application which makes use of Spring-session is available here: https://github.com/bijukunjummen/shopping-cart-cf-app.git。

Reference:

  • Externalizing Session State for a Spring Boot Application Using Spring-Session:https://dzone.com/articles/externalizing-session-state;

  • Spring Session - Spring Boot:http://docs.spring.io/spring-session/docs/current/reference/html5/guides/boot.html;

  • Scaling out with Spring Session:https://blog.jayway.com/2015/05/31/scaling-out-with-spring-session/;

  • 利用spring session解决共享Session问题:http://blog.csdn.net/patrickyoung6625/article/details/45694157;

  • SpringSession原理解析:https://segmentfault.com/a/1190000004369392;

  • 通过Spring Session实现新一代的Session管理:http://www.infoq.com/cn/articles/Next-Generation-Session-Management-with-Spring-Session.

IDEA开发spring boot应用时 application.yml 或 application.properties 自定义属性提示

IDEA开发spring boot应用时 application.yml 或 application.properties 自定义属性提示

在使用spring boot开发过程中,经常会定义一些应用自己的属性,直接写到application配置文件中使用@Value注解进行使用,这样使用也没有什么问题。不过我认为更优雅的方式是定义自己的属性类统一管理,这样在idea中,既能自动提示,又能对配置进行分类管理,显得有条不紊,下面是具体的配置步骤。

 

第一步:添加依赖(分为maven和gradle两种方式)

1.1 如果你使用的是maven

增加依赖

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-configuration-processor</artifactId>
</dependency>

 

1.2 如果你使用的是gradle

增加依赖并且配置annotationProcessor

compileOnly ''org.springframework.boot:spring-boot-configuration-processor''
annotationProcessor ‘org.springframework.boot:spring-boot-configuration-processor’

 

第二步:创建配置属性类

@Data
@ConfigurationProperties(prefix = “myapp.prefix")
public class MyAppProperties {

    private String prop1;
    private int prop2;

}

 

第三步:在配置类中增加注解

@Configuration
@EnableConfigurationProperties(MyAppProperties.class)
public class MyConfig {

}

 

第四步:使用属性类

@Component
public class MyComponent {

    private final MyAppProperties properties;

    public MyComponent(MyAppProperties properties) {
        this.properties = properties;
    }
    // 现在可以使用了

}

对了,别忘记配置你的application.yml

myapp:
  prefix:
    prop1: 1111
    prop2: 2222

或 application.properties

myapp.prefix.prop1=1111
myapp.prefix.prop2=2222

另外需要注意:如果想要idea中自动提示生效,需要重新运行你的应用,有时候没那么快生效。

java – 自从迁移到Spring Boot 1.1.4.RELEASE之后,发生@Value和application.properties问题

java – 自从迁移到Spring Boot 1.1.4.RELEASE之后,发生@Value和application.properties问题

我有一个问题,因为我移动到版本1.1.4.RELEASE的春天启动.

使用@Value注释的变量目前尚未填入值,尽管它们存在于application.properties中.在此之前,我使用的是Spring Boot @ version 1.0.2,而且工作正常.

这一切都是从升级开始的,我没有改变代码.

SampleApplication.java

package org.sample;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;

@Configuration
@ComponentScan
@EnableAutoConfiguration
@PropertySource(value = "classpath:application.properties")
public class SampleApplication {

private static Logger logger = LoggerFactory
        .getLogger(TaskManagerApplication.class);

@Value("${org.sample.sampleProperty}")
private static String sampleProperty;

public static void main(String[] args) {

    SpringApplication.run(SampleApplication.class,args);
    System.out.print("SampleApplication started: " + sampleProperty);

}

@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {

    return new PropertySourcesPlaceholderConfigurer();

}
}

application.properties

spring.datasource.url: jdbc:MysqL://127.0.0.1:3306/mydb
spring.datasource.username: root
spring.datasource.password: root
spring.datasource.driverClassName: com.MysqL.jdbc.Driver
spring.jpa.show-sql: true

#disable the ddl-auto:create once tables have been created
#spring.jpa.hibernate.ddl-auto: create

org.sample.sampleProperty=This is a sample property

photos.upload.dir=C:/temp/UserPhotos/

# Server port
server.port=8081

我尝试添加一个PropertySourcesPlaceholderConfigurer bean,甚至PropertySourcesPlaceholderConfigurer,但仍然存在问题.

有人经历过这个吗?还是有一种新的方式来加载属性文件?

请注意,我的数据库连接和服务器端口正在正确读取,因为我的应用程序可以连接到数据库,我必须通过指定的端口访问它.
sampleProperty变量仍然为空.

解决方法

> @Value不适用于静态字段
> application.properties的属性可以自动使用,而不需要为其指定@PropertySource.
>而不是在main()方法中打印出属性,您应该在构建bean之后执行,例如使用@postconstruct

充分的工作实例:

package demo;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

import javax.annotation.postconstruct;

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application {

    @Value("${org.sample.sampleProperty}")
    private String sampleProperty;

    public static void main(String[] args) {
        SpringApplication.run(Application.class,args);
    }

    @postconstruct
    public void postconstruct() {
        System.out.print("SampleApplication started: " + sampleProperty);
    }
}

Spring Boot application.yml application.properties 优先级

Spring Boot application.yml application.properties 优先级

<divid="article_content" data-mod="popu_307" data-dsm="post" data-pid="blog"> <div> <svg xmlns="http://www.w3.org/2000/svg" title="CSDN 认证原创"aria-hidden="true"> <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#CSDN_Cert" /> </svg>

转载:https://blog.csdn.net/testcs_dn/article/details/79010798

<p>stackoverflow 上有个问题是:<ahref="https://stackoverflow.com/questions/31970576/can-application-properties-and-application-yml-be-mixed" target="_blank" rel="nofollow">Can application.properties and application.yml be mixed?</a></p>

<p>&nbsp;</p>

<p>Spring Boot 虽然做了大量的工作来简化配置,但其配置依然是相当的复杂!</p>

<p> 支持的外部配置方式就高达 17 种之多,当然这很灵活,但灵活就意味着复杂度的提升。</p>

<p>&nbsp;</p>

<p>&nbsp; 这里只说说 & nbsp;application.yml 和 application.properties 两个文件的优先级 </p>

<p>&nbsp;</p>

<p> 如果你的项目中存在 & nbsp;<span>application.properties 文件,</span></p>

<p><span> 那么 & nbsp;<span>application.yml 文件就只是一个摆设。</span></span></p>

<p>&nbsp;</p>

<p><span><span> 为什么这么说呢?</span></span></p>

<p><span><span> 我在 & nbsp;<span>application.properties</span> 文件中配置了:</span></span></p>

<p>server.port=8085</p>

<p>&nbsp;</p>

<p> 在 & nbsp;<span>application.yml 文件中配置了:</span></p>

<p>server:</p>

<p>&nbsp; port: 8086</p>

<p> 启动项目,控制台输出:</p>

<p><span>main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8085 (http)</span></p>

<p> 充分说明了这一点。</p>

<p> 你可能还会关注:<span><strong><a href="http://blog.csdn.net/testcs_dn/article/details/78959700" target="_blank" rel="nofollow">application.properties 文件和 application.yml 文件有什么区别呢?</a></strong></span></p>

<h1><a name="t0"></a>2018-09-26 更新 </h1>

<p> 更新一下对这两个文件的认识,</p>

<p> 其实 & nbsp;<span><span>application.yml </span></span > 文件会被优先加载,</p>

<p> 而如果同时存在 & nbsp;<span>application.properties 文件,并且存在相同的配置,</span></p>

<p><span> 那么则会用 </span>&nbsp;<span>application.properties 文件中的配置覆盖之前的配置;</span></p>

<p><span> 也就是说哪个文件被最后加载,哪个才具有最高级别,</span></p>

<p><span> 因为最后的,会覆盖前面所有的。</span></p>

<h1><a name="t1"></a>2019-02-22 更新 </h1>

<p> 一直比较懒,没去跟踪代码看看底层的究竟;</p>

<p> 关注这个的人还挺多,但何必在这个问题上纠结呢!</p>

<p> 喜欢哪种格式的就用哪种,不要让两种同时存在就好了。</p>

<h1><a name="t2"></a>2019-02-25 更新 </h1>

<p> 有些人可能喜欢追求问题的根源,或者说真相,我这里也看看。</p>

<p> 我的方法:</p>

<p>1、application.properties 文件中加入:</p>

<prename="code"><code>logging.level.root= debug</code><divonclick="hljs.signin (event)" data-title="登录后复制"></div></pre>

<p> 你在 application.yml 中也可以,注意格式。</p>

<p>2、Eclipse 控制台日志输出调大一点,不然可能显示不全 </p>

<p> 控制台窗口空白处右键,首选项 </p>

<p><img width="330" height="427"alt="" src="https://img-blog.csdnimg.cn/20190225171920688.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly93ZWl4aWFvLmJsb2cuY3Nkbi5uZXQ=,size_16,color_FFFFFF,t_70"></p>

<p><img width="714" height="620"alt="" src="https://img-blog.csdnimg.cn/20190225171834909.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly93ZWl4aWFvLmJsb2cuY3Nkbi5uZXQ=,size_16,color_FFFFFF,t_70"></p>

<p>3、启动项目 </p>

<p> 查找 & nbsp;application.properties&nbsp; 或者 & nbsp;&nbsp;application.yml</p>

<p> 我这里会看到以下输出:</p>

<prename="code"><code><ol><li><div><divdata-line-number="1"></div></div><div><div> <span>2019</span>/<span>02</span>/<span>25</span>-<span>16</span>:<span>25</span>:<span>46</span> [main] DEBUG org.springframework.boot.context.config.ConfigFileApplicationListener- Loaded config <span>file</span> <span>''file:/Users/aven/Documents/workspace/fams/fams/target/classes/application.properties''</span> (classpath:/application.properties)</div></div></li><li><div><divdata-line-number="2"></div></div><div><div> <span>2019</span>/<span>02</span>/<span>25</span>-<span>16</span>:<span>25</span>:<span>46</span> [main] DEBUG org.springframework.boot.context.config.ConfigFileApplicationListener- Loaded config <span>file</span> <span>''file:/Users/aven/Documents/workspace/fams/fams/target/classes/application.yml''</span> (classpath:/application.yml)</div></div></li></ol></code><divonclick="hljs.signin (event)" data-title="登录后复制"></div></pre>

<p> 可以看到,从加载顺序上是:先 & nbsp;application.properties&nbsp; 后 & nbsp; application.yml。</p>

<p> 但是这里有一个坑,你接着会看到:</p>

<prename="code"><code><ol><li><div><divdata-line-number="1"></div></div><div><div> <span>2019</span>/<span>02</span>/<span>25</span>-<span>16</span>:<span>25</span>:<span>46</span> [main] DEBUG org.springframework.boot.context.config.ConfigFileApplicationListener- Skipped (empty) config <span>file</span> <span>''file:/Users/aven/Documents/workspace/fams/fams/target/classes/application.properties''</span> (classpath:/application.properties) <span>for</span> profile <span>default</span></div></div></li><li><div><divdata-line-number="2"></div></div><div><div> <span>2019</span>/<span>02</span>/<span>25</span>-<span>16</span>:<span>25</span>:<span>46</span> [main] DEBUG org.springframework.boot.context.config.ConfigFileApplicationListener- Skipped (empty) config <span>file</span> <span>''file:/Users/aven/Documents/workspace/fams/fams/target/classes/application.yml''</span> (classpath:/application.yml) <span>for</span> profile <span>default</span></div></div></li></ol></code><divonclick="hljs.signin (event)" data-title="登录后复制"></div></pre>

<p>Skipped (empty) config file xxx for profile default</p>

<p> 我 E 文不好,这是 “跳过(空)配置文件 xxx” 的意思吧?</p>

<p> 我去对应的目录下看了,文件确实存在的,怎么说是空的呢?</p>

<p> 再往下找,往下看:</p>

<prename="code"><code><ol><li><div><divdata-line-number="1"></div></div><div><div><span>2019</span>/<span>02</span>/<span>25</span><span>-16</span>:<span>26</span>:<span>17</span> [main] DEBUG org.springframework.web.context.support.StandardServletEnvironment- Adding PropertySource <span>''applicationConfig: [classpath:/application.properties]''</span> <span>with</span> search precedence immediately lower than <span>''applicationConfigurationProperties''</span></div></div></li><li><div><divdata-line-number="2"></div></div><div><div> <span>2019</span>/<span>02</span>/<span>25</span><span>-16</span>:<span>26</span>:<span>17</span> [main] DEBUG org.springframework.web.context.support.StandardServletEnvironment- Adding PropertySource <span>''applicationConfig: [classpath:/application.yml]''</span> <span>with</span> search precedence immediately lower than <span>''applicationConfig: [classpath:/application.properties]''</span></div></div></li><li><div><divdata-line-number="3"></div></div><div><div> <span>2019</span>/<span>02</span>/<span>25</span><span>-16</span>:<span>26</span>:<span>17</span> [main] DEBUG org.springframework.web.context.support.StandardServletEnvironment- Removing PropertySource <span>''applicationConfigurationProperties''</span></div></div></li><li><div><divdata-line-number="4"></div></div><div><div> <span>2019</span>/<span>02</span>/<span>25</span><span>-16</span>:<span>26</span>:<span>17</span> [main] DEBUG org.springframework.web.context.support.StandardServletEnvironment- Removing PropertySource <span>''defaultProperties''</span></div></div></li></ol></code><divonclick="hljs.signin (event)" data-title="登录后复制"></div></pre>

<p>Adding PropertySource ''applicationConfig: [classpath:/application.yml]'' with search precedence immediately lower than ''applicationConfig: [classpath:/application.properties]''</p>

<p><strong > 这是说 & nbsp;application.yml 的优先级低于 & nbsp;application.properties 吧?</strong></p>

<p> 到这里结果是不是很明确了呢?</p>

<p> 噢,对了,我的版本是:spring-boot-1.5.9.RELEASE</p>

<p> 有很多文章从代码里面分析,搞的我一看就头大;</p>

<p> 我这里只是简单的从日志输出来分析,</p>

<p> 如果你还不满意,可以根据日志输出提示的类,</p>

<p> 跟踪一下,看看代码上具体是怎么实现的!</p> </div>


我们今天的关于Spring Boot 测试 - 使用 test application.yaml 时 @Value 为空springboottest 引入yml的分享就到这里,谢谢您的阅读,如果想了解更多关于Externalizing Session State for a Spring Boot Application Using Spring-Session、IDEA开发spring boot应用时 application.yml 或 application.properties 自定义属性提示、java – 自从迁移到Spring Boot 1.1.4.RELEASE之后,发生@Value和application.properties问题、Spring Boot application.yml application.properties 优先级的相关信息,可以在本站进行搜索。

本文标签: