spring - Autowired 不适用于 Spring 中的 ConfigurationProperties bean

标签 spring spring-boot autowired spring-bean spring-config

我有一个 application.yml 文件,其中包含如下对象列表:

outlook:
  mailboxes:
    - id: m1
      name: mailbox1

    - id: m2
      name: mailbox2

我创建了一个名为 MailBoxProperties 的 spring 配置类,以便在 bean 中具有这些属性,如下所示:

MailBoxProperties.java

@ConfigurationProperties(prefix = "outlook")
@Configuration
public class MailBoxProperties {

    private List<MailBox> mailboxes;

    public MailBoxProperties() {

    }

    public MailBoxProperties(List<MailBox> mailboxes) {
        this.mailboxes = mailboxes;
    }

    public void setMailBoxes(List<MailBox> mailboxes) {
        this.mailboxes = mailboxes;
    }

    public List<MailBox> getMailBoxes() {
        return mailboxes;
    }

    public static class MailBox {
        public String getName() {
            return this.name;
        }

        public String getId() {
            return this.id;
        }


        private String id, name;

        public MailBox() {

        }

        public MailBox(String id, String name) {
            this.id = id;
            this.name = name;
        }
    }
}

我想将上面的配置bean注入(inject)到另一个配置类中,如下所示:

OutlookConnectionManager.java

@Configuration
@EnableConfigurationProperties
public class OutlookConnectionManager{
  @Autowired
    private MailBoxProperties mailBoxProperties;

    private List<String> names;

    @Bean
    public OutlookConnectionManager getOutlookConnectionManager() {
        OutlookConnectionManager outlookConnectionManager = new OutlookConnectionManager();
        outlookConnectionManager.getMailBoxProperties();
        return outlookConnectionManager;
    }

    public void getMailBoxProperties() {
        names = new ArrayList<String> ();
        for(MailBox mail: mailBoxProperties.getMailBoxes()) {
              this.names.add(mail.getName());
        }
    }
}

但是,MailBoxProperties 始终为 null,并在从 getMailBoxProperties 调用 mailBoxProperties.getMailBoxes() 时引发空指针异常。

(我尝试给@Configuration @EnableConfigurationProperties(MailBoxProperties.class)。它抛出一个异常,指出创建了 2 个 bean。一个是实际路径,另一个是 null)。我尝试过@Import(){MailBoxProperties.class}。

但是,注入(inject)在我的主应用程序类中完美运行,如下所示: 它获取 bean 并正确打印邮箱名称。

MailApplication.java

@SpringBootApplication
public class MailApplication {

    public static void main(String[] args) {
        ApplicationContext context = new SpringApplicationBuilder(MailApplication.class).run(args);
MailBoxProperties props = context.getBean(MailBoxProperties.class);
props. getMailBoxes()
                .forEach(cc -> System.out.println(cc.getName()));

}
}

我是否缺少 OutlookConnectionManager.java 中的任何配置?请帮忙。

注意: 我正在使用 Spring boot 1.5.7.RELEASE

谢谢。

最佳答案

基本上,您的 MailBoxProperties 应该如 @varren 建议的那样。并且不需要用@Configuration注释这个属性类。

所以:

@ConfigurationProperties(prefix = "outlook")
public class MailBoxProperties {

    private List<MailBox> mailboxes;

    public List<MailBox> getMailboxes() {
        return mailboxes;
    }

    public void setMailboxes(List<MailBox> mailboxes) {
        this.mailboxes = mailboxes;
    }

    public static class MailBox {
        private String id, name;

        public String getId() {
            return id;
        }

        public void setId(String id) {
            this.id = id;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }
}

然后你可以让你的 OutlookConnectionManager@Configuration 注解,但是你想在里面做什么有点不正统(你正在重新实例化相同的配置类)与 new 关键字)。

但是,您可以通过将 @Bean 方法更改为:

OutlookConnectionManager:

@Bean
public OutlookConnectionManager getOutlookConnectionManager() {
    OutlookConnectionManager outlookConnectionManager = new OutlookConnectionManager();
    //this call will set this.names
    this.getMailBoxProperties();
    //set this.names to the names variable of outlookConnectionManager instance
    outlookConnectionManager.names = this.names;
    return outlookConnectionManager;
}

关于spring - Autowired 不适用于 Spring 中的 ConfigurationProperties bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46306226/

相关文章:

java - 在 Web 容器 (Tomcat) 中动态加载或替换 jar

java - 如何使用 Mockito 模拟 Spring 的 JdbcTemplate.queryForList?

java - 如果在java中使用MAP,如何发送JSON @RequestBody?

java - @Value 用于在 Spring 3 中初始化 java.util.Date

java - 我如何正确 Autowiring 此类和 applicationContext.xml?

spring - 哪个 JAR 文件包含 JsonProcessingException 类?

spring - 正在将事件配置文件设置为 "native",这在 spring boot 2 配置服务器中是必需的

spring - 使用 Spring Boot 和 Spring Data JPA 的 Hibernate 拦截器或监听器

mysql - 更新数据库时如何解决 NullPointerException

java - Spring:在 Junit 中加载的类中 Autowiring 不同的类