Использование аннотации @Conditional Spring без знания полного имени свойства

#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 реализацию и отфильтровать нужные вам свойства в поиске a prefix и делать то, что вам нужно, если оно присутствует.

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 {
  ...
}
 

Немного запутанно для чего-то простого, но на данный момент это правильный путь.