为什么ConfigurationProperties类中的嵌套类需要为静态的?

时间:2019-05-08 09:35:05

标签: java spring spring-boot

我正在使用application.yml文件作为我的Spring Boot应用程序中的外部配置,该文件使用AppConfig.java批注绑定到@ConfigurationProperties。在AppConfig.java中,我基于application.yml中的层次结构嵌套了类。当我使用static声明嵌套类时,一切正常。但是最近在一个项目中,我错过了一个嵌套类之一的static,并导致了NullPointerException。通过在线资源,我阅读了何时以及何时不使嵌套类静态化。但是,我需要了解在春季启动时application.ymlAppConfig.java的绑定是如何发生的,以及为什么嵌套类需要为static

application.yml

spring:
  foo:
    host: localhost
  bar:
    endpoint: localhost

AppConfig.java

@Component
@ConfigurationProperties("spring")
public class AppConfig {
    private Foo foo;
    private Bar bar;
    public static class Foo {
        private String host;
        // getter, setter
    }
    public class Bar {
        private String host;
        // getter, setter
    }
    //getters, setters
}

当我在其他课程中自动连线AppConfig.java时,appConfig.getFoo()可以正常工作,但是appConfig.getBar()会导致NullPointerException

2 个答案:

答案 0 :(得分:1)

我还没有找到为什么它必须是静态的。 但是,我在文档中发现了其他注释。它与@ConfigurationProperties bean的验证有关。 在这里:

  

配置属性验证器是在应用程序生命周期的早期创建的,并且将@Bean方法声明为static可以使创建该bean而不必实例化@Configuration类。

这是关于内部阶级的。 更多详细信息:https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-external-config-validation

答案 1 :(得分:0)

Spring使用活页夹将属性应用于ConfigurationProperty Bean。

如果getX()不返回类,Spring使用的Binder可以创建实例。但是,这仅限于简单的构造函数。一个非静态的类只能通过引用包含该实例的实例来实例化。

如果这确实是您所需要的,则可以在创建bean的过程中创建该类的实例。

@Component
@ConfigurationProperties("spring")
public class AppConfig {
    private Foo foo = new Foo();
    private Bar bar = new Bar();
    public static class Foo {
        private String host;
        // getter, setter
    }
    public class Bar {
        private String host;
        // getter, setter
    }
    //getters, setters
}