Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么ConfigurationProperties类中的嵌套类需要是静态的?_Java_Spring_Spring Boot - Fatal编程技术网

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

Java 为什么ConfigurationProperties类中的嵌套类需要是静态的?,java,spring,spring-boot,Java,Spring,Spring Boot,我使用application.yml文件作为spring boot应用程序中的外部配置,该应用程序使用@ConfigurationProperties注释绑定到AppConfig.java。在AppConfig.java中,我有基于application.yml中层次结构的嵌套类。当我使用static声明嵌套类时,一切正常。但最近在一个项目中,我错过了其中一个嵌套类的静态,这导致了NullPointerException。通过在线资源,我阅读了何时以及何时不使嵌套类保持静态。但是,我需要了解ap

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

application.yml AppConfig.java
当我在其他类中自动连接
AppConfig.java
时,
AppConfig.getFoo()
工作正常,但是
AppConfig.getBar()
会导致
NullPointerException

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

配置属性验证器是在应用程序生命周期的早期创建的,将@Bean方法声明为static可以创建Bean,而无需实例化@configuration类

这是关于内部阶级的。
更多详细信息:

Spring正在使用绑定器将属性应用于ConfigurationProperty bean

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

如果这是您真正需要的,那么您可以在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
}

这只是猜测,但可能spring在创建非静态内部类实例时遇到了困难,因为在实例化非静态内部类时必须提供对封闭实例的引用。不过,让它保持静态应该不是什么大问题。或者,您可以让它成为非静态的,并使其成为同一个类中的非公共类。java如果您查看
NPE
的堆栈跟踪,您可以很容易地找到抛出它的原因。感谢您指出这一点,这与为什么要首先使用静态嵌套类是一致的。但是,文档中还指出,这样做可以避免早期实例化可能导致的任何问题。知道这些问题是什么吗?谢谢,我现在明白了!可以实例化嵌套类,而无需实例化
@ConfigurationProperties
类。我现在不明白的是,上面答案中给出的spring文档提到了
,这样做可以避免早期实例化可能导致的任何问题。我想不出会出现什么问题!
@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
}
@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
}