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器?
我刚遇到同样的问题,并意识到ConfigurationPropertiesBindingPostProcessor
validation使用@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" ); } } }