#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 спасибо, что указали на это. Я обновил свой ответ с помощью ручного настройки, который работает правильно