クラス レベルの JSR-303 制約を呼び出して JSF からクロス フィールド検証を行い、結果のメッセージを FacesMessage に変換し、ConstraintViolation の PropertyPath に基づいて特定の JSF コンポーネントに結び付ける最良の方法は何ですか?
rich:graphValidatorは近いですが、PropertyPath を利用していません。おそらく、MyFaces extval が私を近づけるかもしれませんが、bean-validation の際にフレームワークの余分なレイヤーが全体的に存在するように見えるので、私はそれを避けました。
簡単な例を次に示します。
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 に変換されることが理想的です。これは、メッセージが追加されたためです。 Bean Validation の流暢な API を使用してそのノードに送信します。