如何拆分Spring Conditional配置?

时间:2018-03-29 08:01:23

标签: java spring configuration conditional

我的应用程序使用自己的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中实现这种条件配置拆分?

2 个答案:

答案 0 :(得分:1)

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

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

这种方式当MyCondition不允许创建配置时,它将被占位符空实现取代。

答案 1 :(得分:0)

我在这个问题中描述的内容预计会起作用......至于" MyCondition"正确地返回true,我的麻烦就在那里。

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

的许多bean。

结果,我的代码以循环" @ Import"结束。这两种配置之间。我不得不从" OptionalAuthenticationConfiguration"移动5豆。到" WebshopSecurityConfig"并使他们每个人#34; @Conditional"。