在配置类上使用自动装配时,Spring Boot出现问题。 我通过在github上创建一个小的spring boot project来最小化问题。
我创建了 MyBean 类,将其声明为 @Component ,然后尝试自动装配声明为 @的 MyConf 类。配置(并读取文件myconfig.properties中的属性)。从理论上讲,一切都在spring上下文中,但是当应用程序启动时,MyBean中的 myConfigProp 变量为空。
我在哪里错了?
我还尝试了以下解决方案,但均不起作用:
我做的最后一个测试(不在github项目上)是将MyConfigProp作为MyBean构造函数中的参数传递,并且有效。
@Component
public class MyBean {
String message;
public MyBean(MyConfigProp myConfigProp) {
this.message = myConfigProp.getMessage();
}
}
我有些困惑。
答案 0 :(得分:0)
好像您没有将MyConfigProp的自动装配到MyBean:
@Component
public class MyBean {
String message;
@Autowired
public MyBean(MyConfigProp myConfigProp) {
this.message = myConfigProp.getMessage();
}
}
答案 1 :(得分:0)
您需要在@EnableConfigurationProperties(MyConfigProp.class)
类中添加MyBean
,使其看起来像:
MyBean.java
@Component
@EnableConfigurationProperties(MyConfigProp.class)
public class MyBean {
String message;
@Autowired
public MyBean(MyConfigProp myConfigProp) {
this.message = myConfigProp.getMessage();
}
}
MyConfigProp.java
@PropertySource("classpath:myconfig.properties")
@ConfigurationProperties(prefix = "config")
public class MyConfigProp {
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
答案 2 :(得分:0)
我尝试了所有解决方案,并且实际上解决问题的唯一方法是从发布开始就将MyConfigProp
作为参数传递给MyBean
构造函数,即使没有@Autowired
。 >
@Component
public class MyBean {
String message;
public MyBean (MyConfigProp myConfigProp) {
this.message = myConfigProp.getMessage ();
}
}
我分享其余的知识。 详细地,尝试提出的解决方案,结果是:
@Component
上的stereo-type
MyConfigProp
注释添加到
在@Autowired
中使用MyBean
无效,即使添加@ComponentScan
。它仍然会启动NullPointerException
@EnableConfigurationProperties
仅在以下情况下才有用
@Configuration
未使用MyConfigProp
,不能解决问题从测试和文档阅读中,如果我理解正确,那么问题是我尝试在@ Autowired
构造函数的MyBean
中使用对象,并且在创建过程中使用{{ 1}}尚未实例化Spring
,因此MyConfigProp
。
我通过添加NullPointerException
solutions
和可能的解决方案来更新code:
package
:上面显示的解决方案。MyBeanWorked
:通过将指令移至方法中,
启动成功,应用程序正常运行。WithoutConstructor
:未声明为WorkedWithInjectProp
,但配置为
@Component
。稍长一点,但是只需要一个属性,也许更清洁。代码中的更多详细信息。 我希望我做得愉快。