1

鉴于下面的示例,我希望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并且cfgA是两个不同配置层次结构的“根”对象) .

cfg:
  srvConfig: 
    name: Dude
  clientConfig: 
    xxx: true
    yyy: Muster
cfgA:
  aaaConfig:
    bbb: false
    ccc: Dundy
  dddConfig:  
    fff: 3

在这种情况下,感觉就像验证的执行(由@Validon触发getSrvConfig())是一个错误。

4

1 回答 1

0

显然这不受支持,应该以不同的方式解决:

@Configuration
@Conditional(MyCondition.class)
@EnableConfigurationProperties(value = { MyConfig.class })
public static class TestCaseConfiguration {
}
于 2017-11-15T12:08:32.373 回答