【问题标题】:How to split Spring Conditional configuration?如何拆分 Spring 条件配置?
【发布时间】:2018-09-08 02:31:46
【问题描述】:

我的应用程序使用自己的 Spring 配置 Condition 来根据设置提供 bean,但由于数量的原因,我希望将长 @Configuration 拆分而不是添加 @Conditional 到数十个 bean。

目前,我的主要安全配置如下所示

@Configuration @EnableOAuth2Client @EnableWebSecurity
@Import(OptionalAuthenticationConfiguration.class)
public class WebshopSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired(required = false)
    private OptionalAuthenticationConfiguration auth;

这里是条件配置

@Configuration
@Conditional(MyCondition.class)
public class OptionalAuthenticationConfiguration {
[...]

由于@Conditional 的可选配置,@Import 注释失败

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'webshopSecurityConfig': Injection of autowired dependencies failed; nested exception is 
org.springframework.beans.factory.BeanCreationException: Could not autowire field: private OptionalAuthenticationConfiguration
WebshopSecurityConfig.auth; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException:
No qualifying bean of type [OptionalAuthenticationConfiguration] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency.
Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

即使 bean 属性 WebshopSecurityConfig.auth 具有 required = false

有没有办法在Spring中实现这种有条件的配置拆分?

【问题讨论】:

  • OptionalAuthenticationConfiguration 是一个配置,你为什么要自动装配它?

标签: java spring configuration conditional


【解决方案1】:

我在这个问题中描述的内容预计会起作用......只要“MyCondition”正确返回 true,我的问题就在那里。

项目上下文比这里显示的要复杂得多:“OptionalAuthenticationConfiguration”实际上是一个 Spring Security SAML 设置,它需要来自“WebSecurityConfigurerAdapter”的许多 bean。

因此,我的代码以这两种配置之间的循环“@Import”结尾。我必须将 5 个 bean 从“OptionalAuthenticationConfiguration”移动到“WebshopSecurityConfig”,并将它们中的每一个都设为“@Conditional”。

【讨论】:

    【解决方案2】:

    使OptionalAuthenticationConfiguration 成为具有两个实现的接口。

    @Conditional(MyCondition.class) 的实际实现和@ConditionalOnMissingBean 的空实现。

    这样,当MyCondition 不允许创建配置时,它将被占位符空实现替换。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-11
      相关资源
      最近更新 更多