使用JSR 303在JSF中使用内联消息传递进行跨域验证

ghi*_*ton 8 java hibernate-validator bean-validation jsf-2

调用JSF交叉字段验证的类级JSR-303约束的最佳方法是什么,并将结果消息转换为FacesMessage并绑定到基于ConstraintViolation中的PropertyPath的特定JSF组件?

rich:graphValidator很接近,但它没有使用PropertyPath.也许MyFaces的延期可以让我接近,但是在bean验证的时候似乎有一整套额外的框架,所以我避免了它.

这是一个简单的例子:

public enum Type {
 ROAD, RACE;
}

public class Driver {
 private String name;
 private Type licenseType;
 ...
}

@CarConstraint
public class Car {
 @Valid
 private Driver driver;
 private Type carType;
 private String make;
 private String model;
 ...
}

public class CarConstraintValidator implements ConstraintValidator<CarConstraint, Car>{
 @Override
 public void initialize(CarConstraint constraintAnnotation) {}

 @Override
 public boolean isValid(Car value, ConstraintValidatorContext context) {
   if(value == null) {return true;}

   if(Type.RACE.equals(value.getCarType()) 
       && !Type.RACE.equals(value.getDriver().getLicenseType())) {

    context.buildConstraintViolationWithTemplate("Driver of this car must have a racing license")
          .addNode("driver")
          .addNode("licenseType")
          .addConstraintViolation();

    return false;
   }

   return true;
  }
}
Run Code Online (Sandbox Code Playgroud)

想象一下输入汽车和驾驶员信息的表格.如果驱动程序的许可证类型为ROAD且汽车的车型为RACE,那么最好将生成的验证消息转换为连接到许可证类型输入的FacesMessage,因为消息已添加使用Bean Validation的流畅api到该节点.

rog*_*rgl 0

我们的团队也遇到了同样的问题。你可以看看OmniFaces。我使用验证器中的代码作为蓝图来构建一个原型,该原型使用反射来调用类级别验证器。