使用@ConfigurationProperties
注释将属性注入bean时,Spring可以定义自定义验证器来验证这些属性。
ConfigurationPropertiesBindingPostProcessor
使用固定的bean名称"configurationPropertiesValidator"
和类org.springframework.validation.Validator
查找此验证程序。
现在假设我在模块A中有一个@ConfigurationProperties
验证器。另一个模块B依赖于模块A.模块B还定义了自己的@ConfigurationProperties
及其自己的验证器。
当应用加载时,后处理器只会选择其中一个bean。这会禁用验证的其他部分。
有解决方案吗?如何在我的应用程序中启用两个配置属性验证器?
答案 0 :(得分:6)
我刚遇到同样的问题并意识到ConfigurationPropertiesBindingPostProcessor
验证用@ConfigurationProperties
注释的类是否实现了Validator接口本身。 (见org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor#determineValidator
)
因此解决方案是将所有属性验证移动到带注释的属性类:
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" );
}
}
}