#spring #spring-annotations
#spring #spring-аннотации
Вопрос:
Я хочу дополнительно включить a @Configuration
в зависимости от того, существует ли тип application.properties
свойства или нет. Однако я не буду знать все имя свойства заранее, только часть его префикса, т.е.
spring.security.oauth2.<provider-name>.url=x.y.z
И цель состоит в том, чтобы включить конфигурацию, используя что-то вроде:
@ConditionalOnProperty(prefix = "spring.security", value="oauth2.*")
или что-то в этом роде, но, похоже, это не работает. Я пробовал несколько комбинаций, ни одна из них не работает, всегда ожидается полное имя свойства, но я не знаю <provider-name>
заранее. Любые способы достижения этой функциональности?
Комментарии:
1. Вы можете создать свою собственную
@Conditional
реализацию и отфильтровать нужные вам свойства в поиске aprefix
и делать то, что вам нужно, если оно присутствует.2. Да, я только что это сделал, но все еще ищу что-то готовое. Если никто не публикует, я опубликую решение здесь
3. Что ж, это решение. Нет ничего готового, что делало бы то, что вы ищете.
Ответ №1:
На данный момент Spring не поддерживает запрошенную функциональность с готовыми аннотациями, что означает @Conditional
, что должно быть создано пользовательское условие, которое выполняет то, что мы хотим. Condition
Реализация выглядит следующим образом:
public class EnableOAuth2Condition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
Environment env = context.getEnvironment();
for(Iterator it = ((AbstractEnvironment) env).getPropertySources().iterator(); it.hasNext(); ) {
PropertySource propertySource = (PropertySource) it.next();
if (propertySource instanceof MapPropertySource) {
for (String propertyName : ((MapPropertySource) propertySource).getSource().keySet()) {
if(propertyName.startsWith("spring.security.oauth2")) {
return true;
}
}
}
}
return false;
}
}
и способ использовать его в @Configuration
классе заключается в следующем:
@Configuration
@Conditional(EnableOAuth2Condition.class)
public class MyOAuth2Config {
...
}
Немного запутанно для чего-то простого, но на данный момент это правильный путь.