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());
}
}