gpt4 book ai didi

java - spring-boot 属性不是@Autowired

转载 作者:搜寻专家 更新时间:2023-10-31 20:11:55 25 4
gpt4 key购买 nike

我正在尝试启动一个 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;
}

我正在尝试在 Controller 中使用它:

@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 的所有值均为空。我确实有一个成功加载值的测试:

@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 没有填充到我的 Controller 中?

最佳答案

您的配置导致 ConfigurationSettings 类的 2 个实例,并且可能一个实例覆盖了另一个。

“ConfigurationSettings”具有 @Component 注释,因为您正在扫描组件 (@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 的强大功能来配置您的应用程序。

关于java - spring-boot 属性不是@Autowired,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22138366/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com