2011-04-12 13 views
8

¿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.

+1

Muy frustrante que esto no se maneje de la caja. Estoy buscando construir mi propia solución :-( –

+0

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

+0

Como mencionó ExtVal puede hacerlo y lo estamos usando para tales casos de uso con éxito. –

Respuesta

0

Nuestro equipo tuvo el mismo problema. Puede echar un vistazo OmniFaces. Utilicé el código de los validadores como un plan para construir un prototipo que usaba la reflexión para llamar a los validadores de nivel de clase.

Cuestiones relacionadas