我正在尝试使用Spring-boot应用程序,我不确定我在这里做错了什么。我在src / main / resources&中有一个application.properties文件。 SRC /测试/资源。我的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吗?
答案 0 :(得分:4)
您的配置会导致ConfigurationSettings
类的2个实例,并且可能一个实例会覆盖另一个实例。
在您扫描组件(@Component
)时,'ConfigurationSettings'具有@ComponentScan
注释,这将导致实例。您还有一个@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的强大功能来配置您的应用程序。