Как отладить впрыск Spring @Value, который не работает?

#spring #spring-boot

Вопрос:

У меня есть простое приложение для загрузки spring. Я пытаюсь ввести значение свойства, которое находится в приложении.yaml , как в —

 @Component
public class ZkWatcher implements Watcher {

    @Autowired
    private Environment env;

    @Value("${spring.cloud.zookeeper.connect-string}")
    private static String CONNECT_STRING;

    ....
}
 

Приложение.yaml выглядит следующим образом:

 server:
  port: 8057
spring:
  application:
    name: ConfigProvider
  cloud:
    zookeeper:
      discovery:
        enabled: true
      connect-string: localhost:2181
  main:
    allow-bean-definition-overriding: true
logging:
  level:
    org.apache.zookeeper.ClientCnxn: WARN
    org.hibernate: ERROR

my:
  prop: xyz
 

Однако инъекция @Value вводит нулевое значение ! Даже если я использую любое другое пользовательское свойство, например «my.prop» , инъекция не работает. Даже инъекция среды вводит нулевое значение. Что я здесь упускаю ? Нужно ли мне явно указывать источник приложения.ямл ?

Комментарии:

1. Привет, Раджеш, я не думаю, что вы можете вводить значения в статическую локальную переменную. если вы удалите статику, она все равно выйдет из строя?

2. Может быть, вы сами создаете экземпляр ZkWatcher с new ключевым словом вместо того, чтобы позволить Spring обрабатывать жизненный цикл?

Ответ №1:

Можете ли вы удалить static ключевое слово из своей CONNECT_STRING переменной и повторить попытку-

 @Component
public class ZkWatcher implements Watcher {

    @Autowired
    private Environment env;

    @Value("${spring.cloud.zookeeper.connect-string}")
    private String CONNECT_STRING;

    ....
}
 

Ответ №2:

Я думаю, что значение, введенное @Value, не может быть статичным. Если вы действительно хотите внедрить его в статическое свойство, пожалуйста, используйте @PostConstruct spring, например:

 @Component
public class Apple {
    private static String color;
    @Value("${color}")
    private String colorInjection ;
    
    @PostConstruct
    public void init(){
        color = this.colorInjection;
    }
}