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