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



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

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

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

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

或者类似的东西,但似乎不起作用。我尝试过多种组合,但都不起作用——它总是需要完整的属性名称,但我事先不知道<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类上使用它的方法如下:

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

对于一些简单的事情来说有点混乱,但这是目前的做法。

相关内容

最新更新