Проверка перекрестных полей со встроенным обменом сообщениями в JSF с JSR 303

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

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{
 @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.

8
задан Konstantin V. Salikhov 8 June 2012 в 09:35
поделиться