8

クラス レベルの 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 を使用してそのノードに送信します。

4

1 に答える 1

0

私たちのチームも同じ問題を抱えていました。あなたはOmniFacesを見ているかもしれません。バリデーターのコードを設計図として使用して、リフレクションを使用してクラス レベルのバリデーターを呼び出すプロトタイプを作成しました。

于 2012-07-18T09:20:58.370 に答える