作为Spring新手,我尝试将外部配置加载到Configuration-Object中,然后尝试自动装配。
以下是我的设置细分到最低限度(较少字段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());
在Apllication.java中。
我阅读了几个关于这个主题的帖子,但是最明显的是自己的实例化会阻止自动装配,我没有这样做,或者扫描无法找到要自动装配的类,而是从我用我的注释和包结构读取的内容不应该是问题。
我的错误在哪里?
PS:似乎从属性文件中正确读取了属性。如果我测试验证,如果省略我尝试自动装配的部分,则抛出Null值的预期错误。
答案 0 :(得分:1)
@Autowired
public static ConfigProperties config;
您无法在Spring中自动加载static
字段。
//只是为了测试autowire是否正常工作
您可以为此编写新的Junit
测试用例。
类似的东西:
@Autowired
public ConfigProperties config;
在你的考试课程中。
答案 1 :(得分:1)
由于注释@Autowired
要求getter / setter注入正确的实现,因此我不建议您连接静态内容。但是,此问题有一种解决方法:
public static ConfigProperties config;
@Autowired
public Application(ConfigProperties config) {
Application.config= config;
}
或者,查看@PostConstruct
注释。
答案 2 :(得分:0)
不要使用静态ConfigProperties。然后使用@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());
}