鉴于下面的示例,我希望不会调用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
触发)就是这种情况下的错误。
答案 0 :(得分:0)
显然这是not supported,应该以不同的方式解决:
@Configuration
@Conditional(MyCondition.class)
@EnableConfigurationProperties(value = { MyConfig.class })
public static class TestCaseConfiguration {
}