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