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

时间:2015-11-21 02:15:09

标签: java spring validation

使用@ConfigurationProperties注释将属性注入bean时,Spring可以定义自定义验证器来验证这些属性。

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

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

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

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

1 个答案:

答案 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" );
        } 
    }
}