在不知道整个 属性 名称的情况下使用 @Conditional Spring 注释

Using @Conditional Spring annotation without knowing the whole property name

我想根据是否存在 application.properties 属性 类型来选择性地启用 @Configuration。但是我 不会 提前知道整个 属性 名称,只知道其前缀的一部分,即

spring.security.oauth2.<provider-name>.url=x.y.z

目标是使用类似以下内容启用配置:

@ConditionalOnProperty(prefix = "spring.security", value="oauth2.*")

或类似的东西,但它似乎不起作用。我尝试了多种组合,none 总是需要完整的 属性 名称,但我事先不知道 <provider-name>。有什么方法可以实现这个功能?

截至目前 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 class 上使用它的方法如下:

@Configuration
@Conditional(EnableOAuth2Condition.class)
public class MyOAuth2Config {
  ...
}

简单的东西有点乱,但现在就这样。