Spring环境中的多个@ConfigurationProperties验证器bean

met*_*bed 7 java validation spring

使用@ConfigurationProperties注释将属性注入bean时,Spring提供了定义自定义验证器以验证这些属性的功能.

ConfigurationPropertiesBindingPostProcessor查找使用固定bean的名字这个验证"configurationPropertiesValidator"和类org.springframework.validation.Validator.

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

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

这个问题有方法解决吗?如何在我的应用程序中启用两个配置属性验证器?

小智 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" );
        } 
    }
}
Run Code Online (Sandbox Code Playgroud)