Java 在自定义Hibernate验证程序上使用Spring依赖项注入
我想创建自己的Hibernate自定义验证器,我想做的是根据从不同上下文(不同的Springbean)收集的一些信息添加自定义逻辑 在我的自定义实现中,我尝试在Springbean中添加构造函数和定义验证器,或者使用Autowire注释,但都没有成功 Autowire示例:Java 在自定义Hibernate验证程序上使用Spring依赖项注入,java,spring,hibernate,dependency-injection,hibernate-validator,Java,Spring,Hibernate,Dependency Injection,Hibernate Validator,我想创建自己的Hibernate自定义验证器,我想做的是根据从不同上下文(不同的Springbean)收集的一些信息添加自定义逻辑 在我的自定义实现中,我尝试在Springbean中添加构造函数和定义验证器,或者使用Autowire注释,但都没有成功 Autowire示例: public class MyCustomValidator implements ConstraintValidator<CustomConstraint, String> { @Autowired
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);
}
}
公共类MyCustomValidator实现ConstraintValidator{
@自动连线
私人MyCustomChecker;
@凌驾
公共void初始化(CustomConstraint约束旋转){
}
@凌驾
公共布尔值有效(字符串值、ConstraintValidatorContext上下文){
if(null==值){
返回true;
}
//获取用户已验证的属性以基于用户执行验证
AuthenticatedIdentity=Context.getAuthenticatedIdentity();
返回customChecker.isWhiteList(标识);
}
}
构造函数示例:
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);
}
}
公共类MyCustomValidator实现ConstraintValidator{
私人MyCustomChecker;
公共MetricDataSizeValidator(MyCustomChecker customChecker){
this.customChecker=customChecker;
}
@凌驾
公共void初始化(CustomConstraint约束旋转){
}
@凌驾
公共布尔值有效(字符串值、ConstraintValidatorContext上下文){
if(null==值){
返回true;
}
//获取用户已验证的属性以基于用户执行验证
AuthenticatedIdentity=Context.getAuthenticatedIdentity();
返回customChecker.isWhiteList(标识);
}
}
我已经在网上读过了,但这并不能完全回答我的问题
我敢肯定,当您想要基于不同上下文中的一些信息进行验证时,这是一个常见的问题,但是我没有找到解决这个问题的答案
我的应用程序使用SpringDI,我的bean已经像这样初始化了
<bean id="customChecker" class="com.mycomp.CustomChecker">
<constructor-arg>
<value>arg</value>
</constructor-arg>
</bean>
arg
有没有关于如何实现这一点的例子
更新
如果我将验证程序配置为:
<bean id="validatorFactory" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
<bean id="validator" factory-bean="validatorFactory"
factory-method="getValidator" />
现在我可以看到验证是使用SpringBeans正确连接的。然而,现在我怀疑我是否在使用HibernateValidator(我想我不是)。是否有任何方法可以实现同样的效果,但要将HibernateValidator工厂配置为使用SpringBean?我假设您的MyCustomValidator未被识别为托管SpringBean,因此不会发生自动连接
使MyCustomValidator成为Springbean的最简单方法是在类级别添加@Component注释。我假设MyCustomValidator未被识别为托管Springbean,因此不会发生自动连接
使MyCustomValidator成为Springbean的最简单方法是在类级别添加@Component注释。对于spring MVC,您可以使用InitBinder,其中您的自定义验证器将由RequestMappingHandlerAdapter自动调用。
只需在控制器中用@InitBinder注释您的方法,并在方法内部通过调用WebDataBinder.setValidator()提供您的验证器并将验证器类提供给WebDataBinder即可。您可以在Spring MVC中使用InitBinder,其中您的自定义验证器将由RequestMappingHandlerAdapter自动调用。
只需在控制器中使用@InitBinder注释您的方法,并在方法内部通过调用WebDataBinder.setValidator()提供您的验证器,并将您的验证器类提供给WebDataBinder即可。您检查过了吗?@Vincz777可能我没有抓住要点,但我没有看到在自定义验证器上使用任何依赖注入,我错了吗?在
MyCustomValidator
类上方添加@Component
注释。Spring应该注入MyCustomChecker
@AndreaGiuliano您找到问题的解决方案了吗?您检查过了吗?@Vincz777可能我没有抓住要点,但我没有看到在自定义验证器上使用任何依赖项注入,我错了吗?在MyCustomValidator
类上方添加@Component
注释。Spring应该注入MyCustomChecker
@AndreaGiuliano您找到问题的解决方案了吗?谢谢您的评论。然而,我尝试添加@Component并使用带限定符的注入,但仍然无法工作。我是否也应该在CustomConstraint接口定义中以某种方式更改@Constraint(validatedBy=MyCustomValidator.class)?您是否确保spring对bean进行类路径扫描?是的,我也这样做,我的大多数bean都被定义到xml文件中。因此,我也尝试在其中定义它,而不是使用@Component注释,但仍然有“javax.validation.ValidationException:HV000064:无法实例化ConstraintValidator:”例外,有趣的是,我在XML中配置了验证器,然后一切都按预期进行,但是我怀疑我实际上不再使用HibernateEvalidator了:/谢谢你的评论。然而,我尝试添加@Component并使用带限定符的注入,但仍然无法工作。我是否也应该在CustomConstraint接口定义中以某种方式更改@Constraint(validatedBy=MyCustomValidator.class)?您是否确保spring对bean进行类路径扫描?是的,我也这样做,我的大多数bean都被定义到xml文件中。因此,我也尝试在其中定义它,而不是使用@Component注释,但仍然有“javax.validation.ValidationException:HV000064:无法实例化ConstraintValidator:”例外,有趣的是,我在XML中配置了验证器,然后一切都按预期进行,但是我怀疑我实际上不再使用HibernateEvalidator了:/