Межполевая валидация с встроенным обменом сообщениями в JSF с JSR 303 - PullRequest
8 голосов
/ 12 апреля 2011

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

rich: graphValidator близко, но не использует PropertyPath.Возможно, Extreme MyFaces мог бы приблизить меня, но, похоже, на момент проверки бинов появился целый дополнительный слой фреймворка, поэтому я избежал этого.

Вот простой пример:

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 проверки бобов.

1 Ответ

0 голосов
/ 18 июля 2012

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

...