spring-boot属性不是@Autowired
我正在尝试使用Spring-boot应用程序,我不确定我在这里做错了什么。 我在src / main / resources&src / test / resources上有一个application.properties文件。 我的ConfigurationSettings有一个@Bean,所以我可以在整个应用程序中使用它们:
@Component public class ConfigurationSettings { private String product; private String version; private String copyright; private String appName; private String appDescription; ... // getters and setters }
以下是我如何启动应用程序:
@Configuration @EnableJpaRepositories @EnableAutoConfiguration @EnableConfigurationProperties @PropertySources(value = {@PropertySource("classpath:application.properties")}) @ComponentScan(basePackages = "com.product") @EnableScheduling public class OFAC { public static void main(String[] args) { ApplicationContext ctx = SpringApplication.run( OFAC.class, args ); }
这是我的配置类:
@Configuration @ComponentScan(basePackages = {"com.product"}) @PropertySources(value = {@PropertySource("classpath:application.properties")}) public class OFAConfiguration { @Autowired private Environment env; @Bean public ConfigurationSettings configurationSettings() { ConfigurationSettings configurationSettings = new ConfigurationSettings(); configurationSettings.setAppDescription( env.getRequiredProperty("app.description" ) ); configurationSettings.setAppName( env.getRequiredProperty( "app.name" ) ); configurationSettings.setServerPort( env.getRequiredProperty( "server.port" ) ); return configurationSettings; }
我试图在控制器中使用它:
@RestController public class AboutController { @Autowired private ConfigurationSettings configurationSettings; @RequestMapping(value = "/about", method = RequestMethod.GET) public About index() { String product = configurationSettings.getProduct(); String version = configurationSettings.getVersion(); String copyright = configurationSettings.getCopyright(); return new About( product, version, copyright ); } }
但是,当通过此步骤时,ConfigurationSettings的所有值都为null。 我有一个成功加载值的测试:
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = {OFAConfiguration.class}) public class OFAConfigurationTest { @Autowired private Environment environment; @Autowired private ConfigurationSettings configurationSettings; @Test public void testConfigurationLoads() { assertNotNull(environment); Assert.assertNotNull(configurationSettings); } @Test public void testConfigurationSettingValues() { assertEquals("Product Name", configurationSettings.getProduct()); assertEquals("0.0.1", configurationSettings.getVersion()); assertEquals("2014 Product", configurationSettings.getCopyright()); }
任何人都可以看到为什么我的控制器中没有填充ConfigurationSettings?
您的配置将导致ConfigurationSettings
类的2个实例,并且可能一个实例会覆盖另一个实例。
当您扫描组件( @ComponentScan
)时,’ConfigurationSettings’具有@Component
注释,这将导致实例。 您还有一个@Bean
注释的方法,它也可以导致一个实例。 后者被第一个覆盖。
简而言之,删除@Component
注释,因为您已经拥有此类的工厂方法。
public class ConfigurationSettings { ... }
您还应该删除@PropertySource
注释,因为Spring-Boot已经为您加载了application.properties
。
最后,您不应在测试类上使用@ContextConfiguration
批注,而应使用@SpringApplicationConfiguration
并传入您的应用程序类(而不是您的配置类!)。
@RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes=OFAC.class) public class OFAConfigurationTest { @Autowired private Environment environment; @Autowired private ConfigurationSettings configurationSettings; @Test public void testConfigurationLoads() { assertNotNull(environment); assertNotNull(configurationSettings); } @Test public void testConfigurationSettingValues() { assertEquals("Product Name", configurationSettings.getProduct()); assertEquals("0.0.1", configurationSettings.getVersion()); assertEquals("2014 Product", configurationSettings.getCopyright()); }
这将解决您的运行时配置问题,并让您的测试使用Spring Boot的强大function来配置您的应用程序。
- 更新Apache POI 4.0后 – 无法识别属性“http://www.oracle.com/xml/jaxp/properties/entityExpansionLimit”
- 在Java中,如何在单线程程序中抛出ConcurrentModificationException?
- 迭代ResultSet并在ArrayList中添加其值
- 尝试使用Jackcess(Java)从Access读取时“不支持整理排序顺序”
- 如何将逗号分隔的字符串拆分为空字符串数组
- 当有2个递归语句如下面的程序时,如何执行递归?
- 从SQS检索多条消息
- Spring Framework – 同一类型的多个ModelAttributes
- Java Generics,如何在使用类层次结构时避免未经检查的赋值警告?