Java Spring环境中的多个@ConfigurationProperties验证程序bean

Java Spring环境中的多个@ConfigurationProperties验证程序bean,java,spring,validation,Java,Spring,Validation,当使用@ConfigurationProperties注释将属性注入bean时,Spring提供了定义自定义验证器来验证这些属性的能力 ConfigurationPropertiesBindingPostProcessor使用固定的bean名称“configurationPropertiesValidator”和类org.springframework.validation.validator查找此验证器 现在假设我有一个@ConfigurationProperties,它的验证器位于模块a中。

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

ConfigurationPropertiesBindingPostProcessor
使用固定的bean名称
“configurationPropertiesValidator”
和类
org.springframework.validation.validator
查找此验证器

现在假设我有一个
@ConfigurationProperties
,它的验证器位于模块a中。另一个模块B依赖于模块a。模块B还定义了它自己的
@ConfigurationProperties
和它自己的验证器

当应用程序加载时,后处理器只拾取其中一个bean。这将禁用验证的其他部分


有解决办法吗?如何在应用程序中同时启用两个配置属性验证器?

我遇到了同样的问题,并意识到
ConfigurationPropertiesBindingPostProcessor
验证用
@ConfigurationProperties
注释的类是否实现了验证器接口本身。(请参见
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" );
        } 
    }
}
import org.springframework.boot.context.properties.ConfigurationProperties;
导入org.springframework.stereotype.Component;
导入org.springframework.validation.Errors;
导入org.springframework.validation.ValidationUtils;
导入org.springframework.validation.Validator;
@ConfigurationProperties(“test.properties”)
@组成部分
公共类TestProperties实现验证器{
私有字符串myProp;
公共字符串getMyProp()
{
返回myProp;
}
公共void setMyProp(字符串myProp)
{
this.myProp=myProp;
}
公共布尔支持(类clazz)
{
return clazz==TestProperties.class;
}
公共无效验证(对象目标、错误)
{
ValidationUtils.rejectIfEmpty(错误,“myProp”、“myProp.empty”);
TestProperties=(TestProperties)目标;
如果(!“validThing”.equals(properties.getMyProp())){
错误。拒绝值(“myProp”,“不是有效的东西”);
} 
}
}

我还意识到,通过这样做,默认的
configurationPropertiesValidator
恢复为
Jsr303ValidatorFactory
,这意味着您可以使用自定义的
Validator
实现和JSR-303注释来验证属性:我无法让它对我起作用。它似乎忽略了我的客户验证器