Проблема с @ConfigurationProperties и @Value при совместном использовании весной

Я использую @ConfigurationProperties и @Value с классом записи (Java 21 и Spring Boot starter 3.2.2). Но свойства с @Value заполняются как нулевые. Я наткнулся на несколько веток, в которых объясняется сценарий вложенных свойств: Spring Inject Values ​​с @ConfigurationProperties и @Value

Может ли кто-нибудь помочь мне понять, почему это не работает для меня?

application.yaml

abc:
  property1: value1
  property_name2: value2

Записывать

@ConfigurationProperties(prefix = "abc")
public record Model(
   String property1,
   @Value("${property_name2}") String property2) {
}

Выход:

Model[property1=value1, property2=null]

Не объединяйте их, точнее, вы не можете их объединить. @Value работает только с bean-компонентами, управляемыми Spring, а @ConfigurationProperties нет и загружается очень рано в процессе. Если вы сделаете это @Component, он снова потерпит неудачу, поскольку теперь он будет игнорировать @ConfigurationProperties и не сможет получить значение. Почему изначально возникает несоответствие? Почему бы просто не переименовать свойство в файле свойств?

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

Ответы 1

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

Как объяснил @M.Deinum в комментариях, вы не можете использовать @ConfigurationProperties с @Value.

Я предполагаю, что есть веская причина, по которой вы не можете просто переименовать свойство в файле свойств (или поле в записи модели).

Я придумал несколько вариантов решения вашей проблемы:

Опция 1: Добавление «геттера» для получения свойства property2, которое фактически использует propertyName2

@ConfigurationProperties(prefix = "abc")
public record Model2(String property1, String propertyName2) {
    public String property2() {
        return propertyName2;
    }
}

Вариант 2. Измените запись модели на компонент и с помощью @Value введите значения из файла свойств.

@Component
public record Model(
        @Value("${abc.property1}")
        String property1,
        @Value("${abc.property_name2}")
        String property2) {
}

Вариант 3: Измените модель на класс и используйте привязку конструктора для сопоставления свойств с атрибутами.

@ConfigurationProperties(prefix = "abc")
public class Model3 {

    private final String property1;
    private final String property2;

    @ConstructorBinding
    public Model3(String property1, String propertyName2) {
        this.property1 = property1;
        this.property2 = propertyName2; // Map propertyName2 to property2
    }

    public String getProperty1() {
        return property1;
    }

    public String getProperty2() {
        return property2;
    }
}

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

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