Spring autowire статического объекта конфигурации не работает - PullRequest
0 голосов
/ 30 апреля 2018

как новичок Spring, я пытаюсь загрузить внешнюю конфигурацию в объект конфигурации, который затем пытаюсь подключить автоматически.

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

Ответы [ 3 ]

0 голосов
/ 30 апреля 2018

Не используйте статические свойства 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());
}
0 голосов
/ 30 апреля 2018

Поскольку аннотация @Autowired требует, чтобы получатели / установщики вставляли правильную реализацию, я не советую вам связывать статический контент. Тем не менее, есть обходной путь для этой проблемы:

public static ConfigProperties config;

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

Кроме того, обратите внимание на аннотацию @PostConstruct.

0 голосов
/ 30 апреля 2018
@Autowired
public static ConfigProperties config;

Вы не можете автоматически связать static поля в Spring.

// просто чтобы проверить, работает ли autowire

Для этого вы можете написать новые Junit контрольные примеры.

Что-то вроде:

@Autowired
public ConfigProperties config;

в вашем тестовом классе.

...