Установите @Value для использования префикса @ConfigurationProperties

#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, у меня это сработало.