为什么Spring bean会被验证,即使条件说它不应该加载到上下文中?

时间:2017-11-14 18:53:23

标签: spring validation spring-boot spring-config

鉴于下面的示例,我希望不会调用MyConfig.getSrvConfig(),因此也不会对返回的对象执行验证。 但由于某种原因,执行验证并且测试用例失败。这个设置有什么问题吗?

我知道如果private MySrvConfigBean srvConfig未在声明中初始化,测试将通过 - 但我真的不希望MySrvConfigBean成为带有@ConfigurationProperties(prefix = "cfg.srvConfig")注释的独立类。

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = { TestCaseConfiguration.class })
public class ConditionalConfigValidationTest {

    @Autowired
    private ApplicationContext applicationContext;

    @Test
    public void test() {
        assertNotNull(applicationContext);
        assertFalse("srvConfig must NOT be in context", applicationContext.containsBean("srvConfig"));
    }

    @Configuration
    @EnableConfigurationProperties(value = { MyConfig.class })
    public static class TestCaseConfiguration {
    }

    @Component
    @Validated
    @ConfigurationProperties(prefix = "cfg")
    public static class MyConfig {
        private MySrvConfigBean srvConfig = new MySrvConfigBean();

        @Bean
        @Valid
        @Conditional(MyCondition.class)
        public MySrvConfigBean getSrvConfig() {
            return srvConfig;
        }

        public static class MySrvConfigBean {

            @NotNull
            private String name;

            public String getName() {
                return name;
            }
        }
    }

    public static class MyCondition implements Condition {
        @Override
        public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
            return false;
        }
    }
}

我们希望这样做的原因是,因为我们能够在代码中以与在YAML文件中相同的方式构造配置,例如:(cfg和{{1}是两个不同配置层次结构的" root"对象。

cfgA

感觉执行验证(由cfg: srvConfig: name: Dude clientConfig: xxx: true yyy: Muster cfgA: aaaConfig: bbb: false ccc: Dundy dddConfig: fff: 3 上的@Valid触发)就是这种情况下的错误。

1 个答案:

答案 0 :(得分:0)

显然这是not supported,应该以不同的方式解决:

@Configuration
@Conditional(MyCondition.class)
@EnableConfigurationProperties(value = { MyConfig.class })
public static class TestCaseConfiguration {
}