#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;
}
}