Cross Field Validation с встроенным обменом сообщениями в JSF с JSR 303

Каков наилучший способ вызвать ограничения JSR-303 на уровне класса, которые выполняют перекрестную проверку полей из JSF и получают полученные сообщения, переведенные в FacesMessage и привязанные к конкретному компоненту JSF на основе PropertyPath в ConstraintViolation?

rich:graphValidator близко, но не использует PropertyPath. Возможно, extval MyFaces мог бы приблизить меня, но, похоже, существует целый дополнительный уровень фреймворка во время проверки 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, которое подключено к входу для типа лицензии, поскольку сообщение было добавлено. к этому узлу, используя свободный API Bean Validation.


person ghilton    schedule 12.04.2011    source источник
comment
Очень расстраивает, что это не обрабатывается из коробки. Я смотрю на создание собственного решения :-(   -  person Peter Davis    schedule 13.04.2011
comment
Ты заставляешь меня чувствовать себя лучше, потому что я не единственный, кто ищет это. Я также думал о создании собственного компонента, возможно, черпая вдохновение из rich:graphValidator и/или используя CDK Rich Faces. Ранее я начал подобное обсуждение на форуме RichFaces: community.jboss.org/thread/164600   -  person ghilton    schedule 14.04.2011
comment
Как вы упомянули, ExtVal может это сделать, и мы успешно используем его для таких случаев.   -  person Dar Whi    schedule 30.08.2011
comment
Здесь уже дан ответ: stackoverflow.com/questions/11890334/   -  person Zilvinas    schedule 18.02.2014


Ответы (1)


У нашей команды была такая же проблема. Вы можете посмотреть OmniFaces. Я использовал код из валидаторов в качестве плана для создания прототипа, который использовал отражение для вызова валидаторов на уровне класса.

person rogergl    schedule 18.07.2012