#java #spring #spring-boot
#java #spring #весенняя загрузка
Вопрос:
У меня есть приложение.yml, который имеет свойство и принимает массив / список, подобный этому
tokens:
token:
- name: one
site: chicago
token:
- name: two
site: 'st. louis'
Как мне использовать @ConditionalOnExpression
так, чтобы просто наличие токенов в приложении.yml достаточно?
Я пробовал @ConditionalOnProperty("tokens")
и @CondtionalOnProperty(prefix="tokens", value= {"token"}
. Это не работает. Даже официальный документ предполагает, что со списками / массивами это не будет работать отлично.
Комментарии:
1. Зачем вам это делать? Будет сложно поддерживать свойство, которое либо присутствует, либо отсутствует. Программисту придется просмотреть код, чтобы выяснить, какое свойство добавить для включения. Было бы лучше иметь второе логическое свойство
tokenPresent
.2. Это очень хороший совет. Проблема в том, что я разрабатываю приложение, которое будет добавлено в качестве зависимости в другие проекты. Я не хочу, чтобы они добавляли ненужные свойства. Вы понимаете, что я имею в виду?
3. Да. Я делал что-то подобное несколько месяцев назад. Сейчас добавлю ответ.
Ответ №1:
Вы можете использовать @Conditional(YourCondition.class)
Запрос из документов:
Единственное условие, которому необходимо соответствовать, чтобы компонент был зарегистрирован. Условия проверяются непосредственно перед тем, как должно быть зарегистрировано определение компонента, и они могут наложить вето на регистрацию на основе любых критериев, которые могут быть определены в этот момент.
Иллюстрация:
@Conditional(MyCondition.class)
@Controller
public class Box{
...
}
public class MyCondition implements Condition{
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
Environment env = context.getEnvironment();
return null == env.getProperty("tokens.token[0].name");
}
}
Здесь en.getProperty
вернет значение null в случае отсутствия свойства.
Комментарии:
1. Теоретически,
ConditionalOnProperty
это могло бы быть выполнено.2. Да, но здесь вы можете написать свою логику внутри
MyCondition
класса.3. @AdityaGupta ty. я немного отредактировал ваш ответ. Если я запрашиваю
env.getProperty("tokens")
, оно всегда возвращает null. Я должен предоставить полное свойство, только тогда оно фактически возвращает значение вместо null.
Ответ №2:
@Faraz Durrani попробуйте эту концепцию, и вы получите…
@Component
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "tokens")
public class ServiceClass{
private String token;
...
}
Комментарии:
1. Нет, Кумар, это полностью отключено. Извините.
2. я сделал пример для этого, и у меня это работает… лучше попробовать вот это….
3. да, я понимаю кумара. Но мой вопрос в другом. Я думаю, вы неправильно поняли вопрос.