Java 静态配置对象的Spring autowire失败

Java 静态配置对象的Spring autowire失败,java,spring,spring-boot,dependency-injection,static,Java,Spring,Spring Boot,Dependency Injection,Static,作为一名Spring新手,我尝试将外部配置加载到配置对象中,然后尝试自动连线 @Autowired public static ConfigProperties config; 以下是我的设置分解为最小值(aso字段较少): 包结构: app |--Application.java app.configuration |--ConfigProperties.java 我的configuration.properties位于: src/main/resources/config Ap

作为一名Spring新手,我尝试将外部配置加载到配置对象中,然后尝试自动连线

@Autowired
public static ConfigProperties config;
以下是我的设置分解为最小值(aso字段较少): 包结构:

app
  |--Application.java
app.configuration
  |--ConfigProperties.java
我的configuration.properties位于:

src/main/resources/config
Application.java:

package app;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import app.configuration.ConfigProperties;

@SpringBootApplication
public class Application
{
    //just to test if autowire works
    @Autowired
    public static ConfigProperties config;

    public static void main(String[] args)
    {
        SpringApplication.run(Application.class, args);

        System.out.println(config.getId());
    }
}
ConfigProperties.java:

package app.configuration;

import javax.validation.constraints.NotBlank;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.validation.annotation.Validated;

@Configuration
@PropertySource("classpath:/config/configuration.properties")
@ConfigurationProperties
@Validated
public class ConfigProperties
{

    @NotBlank
    private String id;

    public String getId()
    {
        return id;
    }

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

}
这将导致该行出现NullPointerException:

System.out.println(config.getId());
在aplication.java中

我读了几篇关于这个主题的文章,但大多数都暗示自己的实例化阻止了自动连接,我没有这样做,或者扫描无法找到要自动连接的类,但从我阅读的注释和包结构来看,这不应该是问题所在

我的错误在哪里

PS:似乎从属性文件中正确读取了属性。如果我测试验证,如果忽略我尝试自动连线的部分,则会为Null值抛出预期错误

@Autowired
public static ConfigProperties config;
无法在Spring中自动关联
静态
字段

//只是为了测试autowire是否工作

您可以为此编写一个新的
Junit
测试用例

比如:

@Autowired
public ConfigProperties config;
在你的测试课上

无法在Spring中自动关联
静态
字段

//只是为了测试autowire是否工作

您可以为此编写一个新的
Junit
测试用例

比如:

@Autowired
public ConfigProperties config;

在测试类中。

不要使用静态配置属性。然后使用
@PostConstruct
从配置对象打印ID

@Autowired
ConfigProperties config;

public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
}

@PostConstruct 
void printId(){
    System.out.println("ID = " + config.getId());
}

不要使用静态配置属性。然后使用
@PostConstruct
从配置对象打印ID

@Autowired
ConfigProperties config;

public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
}

@PostConstruct 
void printId(){
    System.out.println("ID = " + config.getId());
}

由于注释
@Autowired
需要getter/setter来注入正确的实现,因此我不建议您连接静态内容。但是,此问题有一个解决方法:

public static ConfigProperties config;

@Autowired
public Application(ConfigProperties config) {
    Application.config= config;
}

或者,看看
@PostConstruct
注释。

由于注释
@Autowired
需要getter/setter来注入正确的实现,因此我不建议您连接静态内容。但是,此问题有一个解决方法:

public static ConfigProperties config;

@Autowired
public Application(ConfigProperties config) {
    Application.config= config;
}

或者,看看
@PostConstruct
注释。

我不知道;谢谢你的快速回复。assertNotNull测试似乎通过了。我不知道这一点;谢谢你的快速回复。assertNotNull测试似乎已通过。