2011-04-12 86 views
8

什么是调用类级别JSR-303的约束,从JSF做跨字段验证并已返回的消息会转换到的FacesMessage并依赖于特定的JSF的最佳方式基于ConstraintViolation中的PropertyPath的组件?跨字段验证与JSF在线消息与JSR 303

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; 
    } 
} 

图片一种形式,对赛车和车手的信息输入。如果驱动程序具有许可证类型ROAD并且汽车具有汽车类型RACE,则将理想的结果是,将所得到的验证消息转换成连接到许可证类型输入的FacesMessage,因为添加了该消息使用Bean Validation的流利api到该节点。

+1

非常令人沮丧的是,这不是开箱即用的。我正在考虑构建我自己的解决方案:-( – 2011-04-12 20:10:41

+0

)你让我感觉好多了,我并不是唯一一个正在寻找这个的人,我也在考虑创建我自己的组件,也许是从丰富的灵感:graphValidator和/或使用丰富的面孔CDK。早些时候,我在RichFaces论坛上开始了类似的讨论:http://community.jboss.org/thread/164600 – ghilton 2011-04-13 21:53:17

+0

正如你所提到的,ExtVal可以做到这一点,我们正在使用它来处理这种用例 – 2011-08-30 02:36:58

回答

0

我们的团队遇到同样的问题。你可以看看OmniFaces。我使用验证程序的代码作为蓝图来构建使用反射调用类级别验证程序的原型。