【发布时间】:2011-08-04 02:09:17
【问题描述】:
调用类级别 JSR-303 约束的最佳方法是什么?这些约束从 JSF 进行跨字段验证,并将生成的消息转换为 FacesMessage 并基于 ConstraintViolation 中的 PropertyPath 绑定到特定的 JSF 组件?
rich:graphValidator 很接近,但它没有使用 PropertyPath。也许 MyFaces extval 可以让我接近,但在 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;
}
}
想象一个表格,其中输入了有关汽车和驾驶员的信息。如果 Driver 的许可证类型为 ROAD,而 Car 的汽车类型为 RACE,则最好将生成的验证消息转换为 FacesMessage,该 FacesMessage 连接到许可证类型的输入,因为该消息已添加使用 Bean Validation 的 fluent API 到该节点。
【问题讨论】:
-
非常令人沮丧的是,这不是开箱即用的。我正在考虑构建自己的解决方案:-(
-
你让我感觉好多了,我不是唯一一个在寻找这个的人。我也在考虑创建自己的组件,也许是从 rich:graphValidator 和/或使用 Rich faces 的 CDK 中获取灵感。早些时候我在 RichFaces 论坛上发起了类似的讨论:community.jboss.org/thread/164600
-
正如您提到的,ExtVal 可以做到这一点,我们正在成功地将它用于此类用例。
标签: java jsf-2 bean-validation hibernate-validator