Использование @Value дает UnsatisfiedDependencyException

У меня есть класс ApiRest, в котором есть член с именем myKey, который я пытаюсь установить из значения, полученного из файла abc.properties. Когда я использую @Value для установки переменной, я получаю следующую ошибку:

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ... 'org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration': Unsatisfied dependency expressed through constructor parameter 1;

Но если я установлю значение напрямую с помощью private String myKey = "my-Key";, оно будет работать правильно. Мой код выглядит так:

@Path("api/data")
@Controller
@Produces(MediaType.APPLICATION_JSON)
public class ApiRest{
    @Value("${my-service.key}")
    private String myKey;

    private final MyClient myClient = MyClient.builder().key(myKey).build();

    //Remaining Code
    //I use myClient Object to use one of its method
}

Почему @Value не может ввести значение в переменную и как решить эту проблему?

Пожалуйста, покажите свой конструктор. Из исключения, похоже, есть какая-то проблема

Vlad Hanzha 15.02.2019 06:53
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
392
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы не можете прочитать значение поля, значение которого вводится постпроцессором Spring bean до того, как оно будет фактически введено.

См. java-документ @Value

Note that actual processing of the @Value annotation is performed by a BeanPostProcessor

Это означает, что вы слишком рано пытаетесь прочитать значение поля myKey:

private final MyClient myClient = MyClient.builder().key(myKey).build();

Вы должны переместить инициализацию поля myClient в другой метод, который сам по себе, например. помечено @PostConstruct

@PostConstruct
public void init() {
    this.myClient = MyClient.builder().key(myKey).build();
}

Дальнейшее чтение можно сделать здесь

Другие вопросы по теме