使用ConfigFileApplicationContextInitializer不会解析@Value的默认值

时间:2015-11-19 22:30:34

标签: spring-boot

当我使用时:

@ContextConfiguration(classes = { DmiVehicleRTExportConfig.class },
  initializers = ConfigFileApplicationContextInitializer.class)

我的集成测试失败的属性如下:

${oauth2client.prematureTimeout:600}

未获得600的默认值。

这是通过使用:SpringApplicationConfiguration解决的,但我想使用ConfigFileApplicationContextInitializer.class代替SpringApplicationConfiguration

感谢。

2 个答案:

答案 0 :(得分:3)

我有同样的问题。需要添加PropertySourcesPlaceholderConfigurer.class

@ContextConfiguration(classes = { DmiVehicleRTExportConfig.class, 
                           PropertySourcesPlaceholderConfigurer.class },
initializers = ConfigFileApplicationContextInitializer.class)

Spring团队刚刚添加了一条关于此的说明:

  

单独使用ConfigFileApplicationContextInitializer不会为@Value(" $ {...}")注入提供支持。它唯一的工作是确保将application.properties文件加载到Spring的环境中。对于@Value支持,您需要另外配置PropertySourcesPlaceholderConfigurer或使用@SpringBootTest,其中一个将自动为您配置。

答案 1 :(得分:0)

在使用

时,我在JUnit测试中遇到了这个问题
@SpringApplicationConfiguration

我通过添加一个带有静态void main()'的类来解决这个问题。配置类的方法:

@Configuration
public class SpringEmptyApplication{

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

我把这个类放在配置类列表中,如

@SpringApplicationConfiguration(classes = {     
SpringBootEmptyApplication.class,
DmiVehicleRTExportConfig.class 
})

这对我来说非常适合。

如果你想避免

@SpringApplicationConfiguration

你可以尝试

@ContextConfiguration(loader = SpringApplicationContextLoader.class ...

这是@SpringApplicationConfiguration本身如何注释,可能是这个加载器可以修复问题,没试过......