Spring Boot всегда показывает значение аннотации @Value как нулевое - PullRequest
0 голосов
/ 29 мая 2019

В моем проекте Spring-Boot есть небольшой класс, в котором я получаю некоторые значения из файла application.properties.Мой класс находится в папке src/main/java/com/company/package, а файл свойств моего приложения - в src/main/resources/application.properties.Это мой класс:

@Component
@Configuration
@PropertySource("classpath:application.properties")
public class ElasticConnection {

private static final String INDEX = "index_name";
public static final String TYPE   = "type";

private String user;
private String password;

public ElasticConnection(@Value("${elasticsearch.user}")      String user,
                        @Value("${elasticsearch.password}") String password){
    this.user = user;
    this.password = password;
}

Я автоматически подключаю этот класс к классу приложения:

@Configuration
@SpringBootApplication
public class ElasticApplication {

@Autowired
ElasticConnection elastic;

public static void main(String[] args) {

    SpringApplication.run(ElasticApplication.class, args);
}

}

Теперь, как только конструктор класса ElasticConnectionПользователь и пароль установлены на null.Я знаю, что значения читаются правильно, потому что InteliJ достаточно любезен, чтобы показать значение (пока вы не нажмете на @Value и снова не увидите «$ {asticsearch.user}»)

РЕДАКТИРОВАТЬ: это файл свойств приложения.

# App config
server.port=8070

 # Local ElasticSearch instance configuration
 elasticsearch.clustername = elasticsearch
 elasticsearch.host = localhost
 elasticsearch.port = 9300

 #spring.main.allow-bean-definition-overriding=true


 # Elasticsearch Settings
  elasticsearch.user=test
  elasticsearch.password=test

1 Ответ

0 голосов
/ 30 мая 2019

Если мы хотим использовать аннотацию @Value для аргумента конструктора, мы не должны забывать добавить также аннотацию @Autowired к конструктору. Ваш код должен быть:

@Component
@PropertySource("classpath:application.properties")
public class ElasticConnection {

private static final String INDEX = "index_name";
public static final String TYPE   = "type";

private String user;
private String password;

@Autowired
public ElasticConnection(@Value("${elasticsearch.user}")      String user,
                        @Value("${elasticsearch.password}") String password){
    this.user = user;
    this.password = password;
}

Thisпозволяет пружине использовать инжектор конструктора для ваших полей.Вместо того, чтобы вводить значения через конструктор, вы также можете попробовать следующее в вашем коде:

@Component
@PropertySource("classpath:application.properties")
public class ElasticConnection {

private static final String INDEX = "index_name";
public static final String TYPE   = "type";

@Value("${elasticsearch.user}") 
private String user;

@Value("${elasticsearch.password}") 
private String password;

//setters and getters
}

Или вы даже можете использовать аннотацию @ConfigurationProperties для чтения значений из файлов свойств.

Связано: Spring @Autowire в свойствах против конструктора

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...