使用 JSR 303 在 JSF 中使用内联消息进行跨字段验证
Posted
技术标签:
【中文标题】使用 JSR 303 在 JSF 中使用内联消息进行跨字段验证【英文标题】:Cross Field Validation with inline messaging in JSF with JSR 303 【发布时间】: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 可以做到这一点,我们正在成功地将它用于此类用例。 这里已经回答了:***.com/questions/11890334/… 【参考方案1】:我们的团队遇到了同样的问题。你可以看看OmniFaces。我使用来自验证器的代码作为蓝图来构建使用反射调用类级验证器的原型。
【讨论】:
以上是关于使用 JSR 303 在 JSF 中使用内联消息进行跨字段验证的主要内容,如果未能解决你的问题,请参考以下文章
带有 i18n 消息的 Spring-MVC + RESTeasy 表单 bean 验证 (JSR 303)
如果违反 JSR 303 验证约束,如何强制通过 p:ajax 设置 p:inputText 值?