Spring Boot-Spring组件中的@Configuration类为null

时间:2019-07-15 21:53:37

标签: spring spring-boot autowired

在配置类上使用自动装配时,Spring Boot出现问题。 我通过在github上创建一个小的spring boot project来最小化问题。

我创建了 MyBean 类,将其声明为 @Component ,然后尝试自动装配声明为 @的 MyConf 类。配置(并读取文件myconfig.properties中的属性)。从理论上讲,一切都在spring上下文中,但是当应用程序启动时,MyBean中的 myConfigProp 变量为空。

我在哪里错了?

我还尝试了以下解决方案,但均不起作用:

  • 在MyBean中插入 @DependsOn
  • 评论了 @Component 并将MyBean配置为spring的 @Bean

我做的最后一个测试(不在github项目上)是将MyConfigProp作为MyBean构造函数中的参数传递,并且有效。

@Component
public class MyBean {

    String message;

    public MyBean(MyConfigProp myConfigProp) {
        this.message = myConfigProp.getMessage();
    }

}

我有些困惑。

3 个答案:

答案 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。 >

Code update

@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。稍长一点,但是只需要一个属性,也许更清洁。

代码中的更多详细信息。 我希望我做得愉快。