#java #spring #spring-boot
#java #весна #весенняя загрузка
Вопрос:
Я использую файл свойств со значением: com.abc.cpuUtilization.okThreshold = 0.5
Я хочу использовать следующий класс конфигурации:
@Component
@ConfigurationProperties(prefix="com.abc")
public class SystemConfiguration{
@Value("${cpuUtilization.okThreshold}")
private Double cpuUtilizationOkThreshold;
// getters and setters of cpuUtilizationOkThreshold
}
}
Но я получаю исключение из Could not resolve placeholder 'cpuUtilization.okThreshold'
При установке @Value
значения быть: "${com.abc.cpuUtilization.okThreshold}"
это работает, но делает код уродливым и громоздким.
Есть ли способ настроить этот класс, чтобы мне не пришлось писать весь префикс для @Value
аннотации?
Комментарии:
1. Я также сталкиваюсь с аналогичной проблемой, а также не уверен, почему spring просто не позволяет нам использовать Value(«$ {CPUUtilization. Допустимый порог}»). Это заставляет нас создавать другой класс с аннотациями ConfigurationProperties для представления использования CPU.
Ответ №1:
Как сказал thepaoloboi, аннотация @ConfigurationProperties(prefix=»com.abc») позволит вам привязывать поля через их имя. Если вы укажете префикс «com.abc» и у вас есть переменная с именем «CPUUtilization», значение переменной будет равно значению свойства «com.abc.CPUUtilization».
Аннотация @Value извлекает свойство с точно таким же именем. @Value(«${CPUUtilization.threshold}») получит свойство с этим точным именем. Он не учитывает префикс.
Комментарии:
1. Аннотация @Value извлекает свойство с точно таким же именем. @Value(«${CPUUtilization.threshold}») получит свойство с этим точным именем. Он не учитывает префикс. Действительно ли это предложение действительно? Я попытался использовать аннотацию значения внутри моего класса с аннотациями ConfigurationProperties, и он учитывал префикс. К вашему сведению, аннотация значения в моем классе не содержит точки.
Ответ №2:
Для настройки свойств вам просто нужно добавить значения в файл proeprties с тем же ключом, что и переменная.
в application.properties.
com.abc.cpuUtilization.okThreshold=123
Ваш класс должен быть:
@Component
@ConfigurationProperties(prefix="com.abc.cpuUtilization")
public class SystemConfiguration{
private Double okThreshold;
}
}
Комментарии:
1. Я хочу, чтобы префикс был «com.abc» и управлял именем свойства с помощью Value
2. Я согласен с ченсом. Если вы должны поместить префикс в com.abc.CPUUtilization вместо «com.abc», то вы не сможете повторно использовать тот же класс для другого ключа, такого как com.abc.test
Ответ №3:
@ConfigurationProperties(prefix="com.abc")
Аннотация позволит вам привязывать поля через их имя. Как заявил @Olgun YILDIZ, если вы укажете префикс «com.abc» и у вас есть переменная с именем «CPUUtilization» , значение переменной будет соответствовать свойству «com.abc.CPUUtilization». (Фактически, вы могли бы даже назвать свою переменную «cpuutilization», «cpu_utilization», «cpu-utilization» или «CPU_UTILIZATION» из-за смягченных правил Spring для свойств привязки).
Аннотация @Value извлекает свойство с точно таким же именем. @Value("${cpuUtilization.threshold}")
получит свойство с этим точным именем. Он не учитывает префикс.
Либо вы делаете, как предложил @Olgun (префикс «com.abc.CPUUtilization» и имя переменной «okThreshold»), либо вы устанавливаете полное имя свойства в @Value
.
Ответ №4:
@ConfigurationProperties лучше всего работает с иерархическими свойствами, которые все имеют один и тот же префикс, поэтому вы добавляете префикс com.abc.CPUUtilization .Ваш класс POJO должен быть похож
@Configuration
@ConfigurationProperties(prefix="com.abc.cpuUtilization")
public class SystemConfiguration{
private Double okThreshold;
public Double getOkThreshold() {
return okThreshold;
}
public void setOkThreshold(Double okThreshold) {
this.okThreshold = okThreshold;
}
}
}
Если вы не используете @Configuration в POJO, вам нужно добавить @EnableConfigurationProperties(ConfigProperties.class ) в основном классе приложения Spring для привязки свойств к POJO.
Затем вы можете установить значение в application.properties
com.abc.cpuUtilization.okThreshold=0.5
См.:https://www.baeldung.com/configuration-properties-in-spring-boot
Ответ №5:
Сканирование свойств конфигурации Spring работает как сканирование пакетов.
@Value
Аннотация работает с полным именем свойства или необработанным string
значением. И поэтому заданное вами значение должно быть. Предположим, что у вас есть com.abc.cpu-utilization.okThreshold=0.5
свойство.
- Решение 1: вы
SystemConfiguration
изменяетеprefix
и удаляете@Value
:@Getter @Setter @Configuration @ConfigurationProperties(prefix = "com.abc.cpu-utilization") public class SystemConfiguration { private Double okThreshold; }
- Решение 2: вы
SystemConfiguration
можете указывать на com.abc и содержать внутреннюю конфигурацию дляcpu-utilization
промежуточного пакета:@Getter @Setter @Configuration @ConfigurationProperties(prefix = "com.abc") public class SystemConfiguration { private CpuUtilizationConfig cpuUtilization; } @Data public class CpuUtilizationConfig { private Double okThreshold; }
Обратите внимание, что okThreshold
и cpuUtilization
непосредственно отражают имя свойства, которое мы ранее определили. Тогда Весна сотворит волшебство 🙂
См.:
Комментарии:
1. Если мы не хотим, чтобы имя поля «CPUUtilization» отражало имя свойства, какая у нас есть другая альтернатива?
2. Странно.. Я использую попробовать ваше решение, чтобы справиться с моей аналогичной проблемой. Я замечаю, что поле CPUUtilization всегда будет иметь значение null, если я не добавлю, что это поле будет автоматически подключено. В то же время я добавляю ConfigurationProperties (префикс = «CPUUtilization») в класс CpuUtilizationConfig . Кажется, это работает. Я использую spring boot 2.6.2
Ответ №6:
Прежде всего, измените «CPUUtilization.Допустимое значение » для com.abc.cpuUtilization-okThreshold = 0.5
Затем в классе config:
@Component
@ConfigurationProperties("com.abc")
public class SystemConfiguration{
private Double cpuUtilizationOkThreshold;
// getters and setters of cpuUtilizationOkThreshold
}
}
Попробуйте настроить без использования «prefix» и без использования аннотации @Value, у меня это сработало.