как новичок в Spring, я пытаюсь загрузить внешнюю конфигурацию в Configuration-Object, который затем пытаюсь автоматически подключить.
Ниже приведены мои настройки, разбитые до минимума (меньше полей): Структура пакета:
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: кажется, что свойства читаются правильно из файла свойств. Если я проверил валидацию, ожидаемая ошибка выдается для нулевого значения, если не учитывать часть, в которой я пытаюсь выполнить автоматическое подключение.




@Autowired
public static ConfigProperties config;
Вы не можете автоматически подключать поля static в Spring.
//just to test if autowire works
Вы можете написать для этого новые тестовые примеры Junit.
Что-то вроде:
@Autowired
public ConfigProperties config;
в вашем тестовом классе.
Не используйте статический ConfigProperties. Затем используйте @PostConstruct, чтобы распечатать идентификатор из вашего объекта конфигурации.
@Autowired
ConfigProperties config;
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@PostConstruct
void printId(){
System.out.println("ID = " + config.getId());
}
Поскольку аннотация @Autowired требует, чтобы геттеры / сеттеры вводили правильную реализацию, я не предлагаю вам подключать статический контент. Однако есть обходной путь для этой проблемы:
public static ConfigProperties config;
@Autowired
public Application(ConfigProperties config) {
Application.config= config;
}
Как вариант, взгляните на аннотацию @PostConstruct.
Я этого не знал; спасибо за быстрый ответ. assertNotNull-test кажется пройденным.