Каков наилучший способ вызвать ограничения уровня 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 проверки бобов.