SpringBoot; Можем ли мы использовать @Value в перечислениях Java

#java #spring #spring-boot #enums

#java #spring #spring-boot #перечисления

Вопрос:

Можно ли использовать @Value(«${myapp.token.key}») в классе Enum?

Рекомендуется ли использовать @Configuration или @ConfigurationProperties в классе Enum?

— JK

Ответ №1:

Нет, это не так. Цель перечисления — предоставить нам сопоставленные данные (фиксированный набор значений) с ограниченной областью действия. Если бы мы хотели использовать @Value в Java enums, это в первую очередь лишило бы цели перечисления.

То же самое касается @Configuration , мы делаем это, когда хотим внедрить экземпляры в контейнер Spring. Это не имеет никакого смысла для перечислений.

Если вы опубликуете фактическую причину, по которой вы пытались это сделать, мы сможем указать вам правильное направление / решение.

Комментарии:

1. Спасибо @Alessandra. Да, это имеет смысл и, следовательно, мой вопрос, поскольку у меня были сомнения по поводу этого подхода.

2. Чтобы дать более подробную информацию: например: мне нужно вызвать 2 службы — Order amp; Inventory, у меня есть перечисление, в котором есть Order и Inventory. Также для того, чтобы в перечислении были указаны соответствующие URL-адреса, которые необходимо прочитать из файла свойств ресурсов spring boot.

3. Эй, @codegeek, похоже, тебе не нужно перечисление. Попробуйте внедрить класс свойств в контейнер с помощью @ConfigurationProperties . Затем используйте это для доступа к вашим переменным env (URL). Удачи.

4. Вы @ConfigurationProperties можете определить Map<MyEnum, URI> .

5. Спасибо @chrylis — осторожно оптимистичный — и раздражительный, я пытался использовать MyEnum.url, как будто у меня есть и другой тип класса среды выполнения, но я получил то, что мне было нужно.

Ответ №2:

Это возможно, но это не просто и определенно не очень хорошая идея. Вместо этого предпочитаем сервис, который реализует интерфейс, эквивалентный Function<MyEnum, String> .

Ответ №3:

Вы можете создать класс со статическими полями и значениями по умолчанию, как показано ниже

 class EnumLikeClass {

  public static String key;

  @Value("${myapp.token.key:Default value}")
  public void setKey(String keyTemp) {
    EnumLikeClass.key = keyTemp;
  }

}
  

Теперь вы можете вызывать как

 EnumLikeClass.key
  

Комментарии:

1. Нет, ты не можешь ! вы не можете напрямую ввести @value в статическое поле, это не сработает!

2. @shivarajan да, это неправильный ответ! Он вернет значение null, если мы используем со статическими полями

3. @shivarajan спасибо, что указали на это. Я обновил свой ответ с помощью ручного настройки, который работает правильно