¿Cuál es la mejor manera de invocar restricciones de nivel de clase JSR-303 que realizan validación de campo cruzado desde JSF y hacer que los mensajes resultantes se traduzcan a FacesMessage y se vinculen a un JSF particular componente basado en PropertyPath en ConstraintViolation?Validación en campo cruzado con mensajes en línea en JSF con JSR 303
rich:graphValidator está cerrado, pero no hace uso de PropertyPath. Quizás la extvaluación de MyFaces podría acercarme, pero parece que hay una capa adicional de framework a tiempo de validación de bean, así que lo evité.
Aquí está un ejemplo sencillo:
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;
}
}
imagen una forma en que la información sobre el coche y el conductor son de entrada. Si el Conductor tenía un tipo de licencia de ROAD y el Automóvil tenía un tipo de automóvil de RACE, sería ideal ver que un mensaje de validación resultante se traduzca en un FacesMessage conectado a la entrada para el tipo de licencia, ya que el mensaje se agregó a ese nodo usando la api fluida de Bean Validation.
Muy frustrante que esto no se maneje de la caja. Estoy buscando construir mi propia solución :-( –
Me haces sentir mejor de que no soy el único que está buscando esto. Estaba pensando en crear mi propio componente también, tal vez inspirándome en rich: graphValidator y/o usando el CDK de Rich Face. Antes comencé una discusión similar en el foro de RichFaces: http://community.jboss.org/thread/164600 – ghilton
Como mencionó ExtVal puede hacerlo y lo estamos usando para tales casos de uso con éxito. –