我正在尝试使用Hibernate Validator
验证请求对象。
作为一个简单示例,假设我尝试验证的对象的类具有B bObj
字段,其中B
是另一个具有String name
字段的类。
出于这个原因,我已经实现了我自己的自定义Constraint Annotations
链接到自定义MyValidator implements ConstraintValidator
类。
DTO课程
@AclassValidate(groups = {Operations.Insert.class, Operations.Update.class javax.validation.groups.Default.class})
public class A {
@BclassValidate(groups = {Operations.Insert.class, Operations.Update.class})
private B bObj;
// setters, getters
}
我的端点方法签名(调用验证程序,并设置活动组):
@PostMapping("/test")
public A createA(
@Validated(value = Operations.Insert.class)
// @Validated(value = Operations.Update.class)
@RequestBody A a
)
我的验证员类
public class BclassValidator implements ConstraintValidator<BclassValidate, B> {
public void initialize(BclassValidate constraintAnnotation) {
}
public boolean isValid(B b, ConstraintValidatorContext constraintContext) {
boolean valid = true;
// Get active group here
activeGroup = ..?
if (activeGroup == Operations.Insert.class) {
// check if b.getName() equals to "John"
}
else if (activeGroup == Operations.Update.class) {
// check if b.getName() equals to "Doe"
}
return valid;
}
}
我想要实现的是根据活动组对同一字段应用不同的验证。活动组是组,设置为@Validated
注释。问题是如何检索活动组以便根据其值应用不同的验证?
答案 0 :(得分:0)
您无法从约束验证器中获取当前已验证的组。
相反,你应该将你的约束分成几个,在你的情况下,一个用于插入,一个用于更新。然后,您可以将这些单独的约束分配给每个验证组。
答案 1 :(得分:0)
你应该得到这样的活跃验证组:
public class BclassValidator implements ConstraintValidator<BclassValidate, B> {
public void initialize(BclassValidate constraintAnnotation) {
}
public boolean isValid(B b, ConstraintValidatorContext constraintContext) {
boolean valid = true;
// Get active group here
Set<Class<?>> activeGroups = null;
if (context instanceof ConstraintValidatorContextImpl) {
activeGroups = ((ConstraintValidatorContextImpl) context).getConstraintDescriptor().getGroups();
} else {
activeGroups = Collections.emptySet();
}
if (activeGroups.contains(Operations.Insert.class)) {
// check if b.getName() equals to "John"
}
else if (activeGroups.contains(Operations.Update.class)) {
// check if b.getName() equals to "Doe"
}
return valid;
}
}
答案 2 :(得分:0)
Hibernate 验证器使用自定义约束的配置组验证当前活动的组,因此我们无需编写逻辑来验证它。但是无法找到当前活动的组。
原因:“valueContext”持有当前活动的组,但没有传递给“isValid”方法。