Java 使用Spring/Spring引导注册Bean验证值提取器

Java 使用Spring/Spring引导注册Bean验证值提取器,java,spring,hibernate,spring-boot,validation,Java,Spring,Hibernate,Spring Boot,Validation,设置 我有一个自定义容器类: public class PatchField<T> { private boolean isSet; private T value; public PatchField(T value) { this.isSet = true; this.value = value; } public PatchField(boolean isSet, T value) {

设置

我有一个自定义容器类:

public class PatchField<T> {

    private boolean isSet;
    private T value;

    public PatchField(T value) {
        this.isSet = true;
        this.value = value;
    }

    public PatchField(boolean isSet, T value) {
        this.isSet = isSet;
        this.value = value;
    }

    //Getters and Setters
}
当然,我可以创建自己的验证程序Bean。我已经测试了它,它可以工作:


@Configuration
public class CustomValidator {

    @Bean
    public Validator validator() {
        ValidatorFactory validatorFactory = Validation.byDefaultProvider()
                .configure()
                .addValueExtractor(new PatchFieldValueExtractor())
                .buildValidatorFactory();
        return validatorFactory.getValidator();
    }
}
然而,我担心这样做会使我对当前或未来的自动配置“好处”产生怀疑。例如,RestTemplate和RestTemplateBuilder之间存在细微差别,这可能会导致本文中概述的意外运行时行为。所以我不愿意走这条路。关于如何定制验证器有更好的版本吗

我已经看过的资料来源

。根据文件:

您可以使用LocalValidatoryFactoryBean将默认验证器配置为Springbean

前面示例中的基本配置使用默认引导机制触发bean验证进行初始化。JSR-303或JSR-349提供程序(如Hibernate验证器)预计会出现在类路径中,并被自动检测到

其他配置选项

默认的LocalValidatoryFactoryBean配置对于大多数情况都足够了对于各种Bean验证构造,从消息插值到遍历解析,有许多配置选项。有关这些选项的更多信息,请参阅LocalValidatoryBeanJavadoc。

此API不包含如何注册自定义ValueExtractor的明确信息


没有提到LocalValidatorFactoryBean或如何自定义它。

也许您可以在参考资料/META-INF/services/javax.validation.valueextraction.ValueExtractor中注册

com.yourpackagename.PatchFieldValueExtractor

要注册自定义
ValueExtractor
,需要扩展
localvalidatorybean

@Component
public class CustomLocalValidatorFactoryBean extends LocalValidatorFactoryBean {

    @Override
    protected void postProcessConfiguration(Configuration<?> configuration) {
        super.postProcessConfiguration(configuration);

        configuration.addValueExtractor(new PatchFieldValueExtractor());
    }
}

@组件
公共类CustomLocalValidatorFactoryBean扩展了LocalValidatorFactoryBean{
@凌驾
受保护的无效后处理配置(配置){
超级后处理配置(配置);
addValueExtractor(新的PatchFieldValueExtractor());
}
}

建议多种方法注册
ValueExtractor
s。其中2个是通过XMLI,可以通过ValidatorContext#addValueExtractor(ValueExtractor)注册ValueExtractor,如问题所示。但是我在问,,如果有一种方法可以在Spring中注册新的ValueExtractor,而无需将Validator重新创建为Bean。如链接文档中所示,有两种方法可以通过XML实现,这正是您所要求的。有没有任何方法可以在没有XML的情况下以编程方式实现这一点?您可以尝试从Spring中获取
LocalValidatoryFactoryBean
上下文和添加验证器立即测试并生效!谢谢

@Configuration
public class CustomValidator {

    @Bean
    public Validator validator() {
        ValidatorFactory validatorFactory = Validation.byDefaultProvider()
                .configure()
                .addValueExtractor(new PatchFieldValueExtractor())
                .buildValidatorFactory();
        return validatorFactory.getValidator();
    }
}
com.yourpackagename.PatchFieldValueExtractor
@Component
public class CustomLocalValidatorFactoryBean extends LocalValidatorFactoryBean {

    @Override
    protected void postProcessConfiguration(Configuration<?> configuration) {
        super.postProcessConfiguration(configuration);

        configuration.addValueExtractor(new PatchFieldValueExtractor());
    }
}