Bean Validation/Hibernate Validator能否在验证时检测请求的验证组?
如何在自定义约束验证器中获取当前请求的验证组?
这是一个旧问题的延续,时隔九年及多个Bean Validation规范版本发布后,想确认规范是否有更新,或是Hibernate Validator是否提供了非标准解决方案:能否让自定义约束验证器通过ConstraintValidatorContext检测到本次验证请求传入的验证组?
具体场景示例
假设存在如下Bean:
public class MyBean { @MyConstraint(value = 5, groups = V1.class) @MyConstraint(value = 10, groups = {V2.class, V3.class}) private int foo; // 省略其他代码 }
当调用验证方法时:
validator.validateValue(MyBean.class, "foo", 7, V2.class);
希望自定义约束验证器能检测到本次请求的验证组为V2.class,验证器代码如下:
public class MyConstraintValidator implements ConstraintValidator<MyConstraint, Integer> { // 省略初始化等代码 @Override public boolean isValid(Integer value, ConstraintValidatorContext context) { Class<?>[] requestedValidationGroups = // 期望此处获取到 {V2.class} // 业务逻辑处理 return false; } }
当前遇到的问题
在initialize方法中仅能获取到约束注解上静态声明的组(比如{V1.class}或{V2.class, V3.class}),但实际需要的是本次验证请求传入的{V2.class}。
已做的排查
查看Hibernate Validator 6.0源码后发现,理论上需要访问org.hibernate.validator.internal.engine.ValueContext<T, V>的currentGroup属性,但该属性以及ValueContext并未传入org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorContextImpl,且该类的创建逻辑无法定制,寻求进一步解决提示。
内容的提问来源于stack exchange,提问作者Mauro Molinari
相关产品推荐
相关产品推荐

