2010-04-18 4 views
8

Estoy buscando el uso de Hibernate Validator para un requisito mío. Quiero validar un JavaBean donde las propiedades pueden tener múltiples verificaciones de validación. Por ejemplo:Generación de un código de error por propiedad en Hibernate Validator

class MyValidationBean 
{ 
    @NotNull 
    @Length(min = 5, max = 10) 
    private String myProperty; 
} 

Pero si esta propiedad no pasa la validación Quiero un código de error específico que se asocia con la ConstraintViolation, con independencia de que fracasó debido a @Required o @Length, aunque me gustaría conservar el error mensaje.

class MyValidationBean 
{ 
    @NotNull 
    @Length(min = 5, max = 10) 
    @ErrorCode("1234") 
    private String myProperty; 
} 

Algo como lo anterior sería bueno, pero no tiene que ser estructurado exactamente así. No veo la manera de hacerlo con Hibernate Validator. ¿Es posible?

Respuesta

0

Desde la sección 4.2. ConstraintViolation de la especificación:

El método getMessageTemplate devuelve el mensaje de error no interpolada (por lo general el atributo message en la declaración de restricción). Frameworks puede usar esto como una clave de código de error.

Creo que esta es su mejor opción.

+1

Gracias por la respuesta. Lamentablemente, no creo que esto preserve el mensaje de error original, que me gustaría. Estoy buscando un código de error adicional además de esto. Mirando tristemente la API de ConstraintViolation, realmente no veo nada que parezca prometedor. –

0

Lo que trataría de hacer es aislar este comportamiento en la capa DAO de la aplicación.

Usando su ejemplo tendríamos:

public class MyValidationBeanDAO { 
    public void persist(MyValidationBean element) throws DAOException{ 
     Set<ConstraintViolation> constraintViolations = validator.validate(element); 
     if(!constraintViolations.isEmpty()){ 
      throw new DAOException("1234", contraintViolations); 
     } 
     // it's ok, just persist it 
     session.saveOrUpdate(element); 
    } 
} 

Y la clase siguiente excepción:

public class DAOException extends Exception { 
private final String errorCode; 
private final Set<ConstraintViolation> constraintViolations; 

public DAOException(String errorCode, Set<ConstraintViolation> constraintViolations){ 
    super(String.format("Errorcode %s", errorCode)); 
    this.errorCode = errorCode; 
    this.constraintViolations = constraintViolations; 
} 
// getters for properties here 
} 

Se podría añadir alguna anotación información sobre la base de lo que la propiedad no se ha validado desde aquí, pero siempre haciendo esto en el método DAO.

Espero que haya sido de ayuda.

4

Puede crear una anotación personalizada para obtener el comportamiento que está buscando y luego al validar y usar refelection puede extraer el valor de la anotación. Algo parecido a lo siguiente:

@Target({ElementType.FIELD}) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface ErrorCode { 
    String value(); 
} 

En el bean:

@NotNull 
@Length(min = 5, max = 10) 
@ErrorCode("1234") 
public String myProperty; 

En la validación de su frijol:

Set<ConstraintViolation<MyValidationBean>> constraintViolations = validator.validate(myValidationBean);  
for (ConstraintViolation<MyValidationBean>cv: constraintViolations) { 
    ErrorCode errorCode = cv.getRootBeanClass().getField(cv.getPropertyPath().toString()).getAnnotation(ErrorCode.class); 
    System.out.println("ErrorCode:" + errorCode.value()); 
} 

Habiendo dicho que probablemente pondría en duda los requisitos para querer códigos de error para estos tipos de mensajes.

+0

Esta es una gran solución, muchas gracias por publicar. Solo una cosa para tener en cuenta ... El código debería leer getDeclaredField para permitirle acceder al campo privado. – MandyW

Cuestiones relacionadas