在不知道整个 属性 名称的情况下使用 @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 {
...
}
简单的东西有点乱,但现在就这样。
我想根据是否存在 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 {
...
}
简单的东西有点乱,但现在就这样。