Spring环境中的多个@ConfigurationPropertiesvalidation器bean

使用@ConfigurationProperties批注将属性注入bean时,Spring提供了定义自定义validation器以validation这些属性的function。

ConfigurationPropertiesBindingPostProcessor使用固定的bean名称"configurationPropertiesValidator"和类org.springframework.validation.Validator查找此validation器。

现在假设我在模块A中有一个带有validation器的@ConfigurationProperties 。另一个模块B依赖于模块A.模块B还定义了自己的@ConfigurationProperties和它自己的validation器。

当应用程序加载时,后处理器只选择其中一个bean。 这会禁用validation的其他部分。

有针对这个的解决方法吗? 如何在我的应用程序中启用两个配置属性validation器?

我刚遇到同样的问题,并意识到ConfigurationPropertiesBindingPostProcessorvalidation使用@ConfigurationProperties注释的类是否实现了Validator接口本身。 (参见org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor#determineValidator

因此,解决方案是将所有属性validation移动到带注释的属性类:

 import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import org.springframework.validation.Errors; import org.springframework.validation.ValidationUtils; import org.springframework.validation.Validator; @ConfigurationProperties("test.properties") @Component public class TestProperties implements Validator { private String myProp; public String getMyProp() { return myProp; } public void setMyProp( String myProp ) { this.myProp = myProp; } public boolean supports( Class clazz ) { return clazz == TestProperties.class; } public void validate( Object target, Errors errors ) { ValidationUtils.rejectIfEmpty( errors, "myProp", "myProp.empty" ); TestProperties properties = (TestProperties) target; if ( !"validThing".equals( properties.getMyProp() ) ) { errors.rejectValue( "myProp", "Not a valid thing" ); } } }