Я использую @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]




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