2012-07-11 9 views
8

Estoy usando Hibernate Validator 4.2.0.Final y estoy buscando la forma más sencilla de incluir el nombre del campo de clase en mi mensaje de error.Incluir nombre de campo dentro de un mensaje de error usando Hibernate Validator

Lo que encontré es el siguiente hilo Using a custom ResourceBundle with Hibernate Validator. De acuerdo con esto, debería crear mi anotación personalizada para cada anotación de restricción agregando una propiedad a cada una.

¿Hay una forma más limpia de lograr esto?

El siguiente código:

@Size(max = 5) 
private String myField; 

produce error por defecto: tamaño debe estar entre 0 y 5.

me gustaría que fuera: tamaño myField debe estar entre 0 y 5.

Gracias de antemano.

Respuesta

0

Para todos aquellos que buscan una forma de acceder a la clase dentro de su validador. Poner anotaciones de hibernación en un nivel de clase en lugar de nivel de variable le da acceso a un objeto de clase (suponiendo que haya definido un validador personalizado).

public class myCustomValidator implements ContraintValidator <MyAnnotation, MyAnnotatedClass> { 

    public void initialize (...){ ... }; 

    public boolean isValid (MyAnnotatedClass myAnnotatedClass) { 

     // access to elements of your myAnnotatedClass 

    } 
} 
2

No conozco ninguna forma genérica, pero puede definir un mensaje de error personalizado e incluir el nombre del campo en él.

@Size(max = 5, message = "myField size must be between 0 and 5") 
private String myField; 
+2

No internacionalización de esa manera. – dbreaux

0

uso oval esto tiene buen número de anotaciones y las posibles formas de mostrar los mensajes.

14

, usted puede obtener el nombre del campo con el método de la getPropertyPath()ConstraintViolation class.

Un buen mensaje de error por defecto puede ser:

violation.getPropertyPath() + " " + violation.getMessage(); 

que le dará "foo no puede ser nulo", o "foo.bar no puede ser nulo" en el caso de objetos anidados.

+0

esto fue perfecto para mí hermano. Gracias. –

+0

Este es un patrón de uso común. – okwap

+0

Cómo obtener un nombre de campo particular – DEADEND

0

puse todos los mensajes de validación de campo en el archivo de propiedades, así:

field.student.name.size.message = Student name size is not valid. 

y en el grano, lo utilizan como esto:

@Size(max = 5, message = "${field.student.name.size.message}") 
private String myField; 

Sé que no es una perfecta solución, pero tampoco encuentro una mejor manera.

0

uso de este método (ex es ConstraintViolationException ejemplo):

Set<ConstraintViolation<?>> set = ex.getConstraintViolations(); 
List<ErrorField> errorFields = new ArrayList<>(set.size()); 
ErrorField field = null; 
for (Iterator<ConstraintViolation<?>> iterator = set.iterator();iterator.hasNext();) { 
    ConstraintViolation<?> next = iterator.next(); 
    System.out.println(((PathImpl)next.getPropertyPath()) 
      .getLeafNode().getName() + " " +next.getMessage()); 


} 
Cuestiones relacionadas