在自定义 Hibernate 验证器上使用 Spring 依赖注入



我想创建自己的Hibernate自定义验证器,我想做的是根据从不同上下文(不同的Spring bean(收集的一些信息添加自定义逻辑

在我的自定义实现中,我尝试在弹簧豆中添加构造函数和定义验证器,或者使用 Autowire 注释,但它们都不起作用

自动连线示例:

public class MyCustomValidator implements ConstraintValidator<CustomConstraint, String> {
@Autowired
private MyCustomChecker customChecker;
@Override
public void initialize(CustomConstraint constraintAnnotation) {
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if (null == value) {
return true;
}
//get user authenticated properties to perform validation based on the user
AuthenticatedIdentity identity = Context.getAuthenticatedIdentity();
return customChecker.isWhitelisted(identity);
}
}

构造函数示例:

public class MyCustomValidator implements ConstraintValidator<CustomConstraint, String> {
private MyCustomChecker customChecker;
public MetricDataSizeValidator(MyCustomChecker customChecker) {
this.customChecker = customChecker;
}
@Override
public void initialize(CustomConstraint constraintAnnotation) {
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if (null == value) {
return true;
}
//get user authenticated properties to perform validation based on the user
AuthenticatedIdentity identity = Context.getAuthenticatedIdentity();
return customChecker.isWhitelisted(identity);
}
}

我已经阅读了官方的Hibernate文档,但这并不能完全回答我的问题。

我很确定当您想根据来自不同上下文的某些信息进行验证时,这是一个常见问题,但是我没有找到答案。

我的应用程序正在使用Spring DI,我的bean已经像这样初始化了

<bean id="customChecker" class="com.mycomp.CustomChecker">
<constructor-arg>
<value>arg</value>
</constructor-arg>
</bean>

有没有关于如何实现这一目标的例子?

更新

如果我将验证器配置为:

<bean id="validatorFactory" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
<bean id="validator" factory-bean="validatorFactory"
factory-method="getValidator" />

现在我可以看到验证是使用弹簧豆正确连接的。但是,现在我怀疑我是否正在使用HibernateValidator(我认为我没有(。有没有办法实现相同的但配置HibernateValidator工厂使用Spring bean?

我假设您的 MyCustomValidator 未被识别为托管的 Spring Bean,因此不会发生自动连线。

使 MyCustomValidator 成为 Spring Bean 的最简单方法是在类级别添加@Component注释。

你可以在Spring MVC的情况下使用InitBinder,你的自定义验证器将由RequestMappingHandlerAdapter自动调用。 只需在控制器中用@InitBinder注释你的方法,在方法中提供你的验证器,并通过调用webDataBinder.setValidator((将你的验证器类提供给WebDataBinder

最新更新