2011-03-07 9 views
11

Disculpe si esta pregunta ya se ha cubierto anteriormente. Si tiene enlace, no he podido encontrar una respuesta satisfactoria todavía.Hacer que el mensaje de error de validación de javax sea más específico

He estado buscando la forma de que los mensajes de error proporcionados por mi validación javax sean más específicos.

El mensaje de este momento tengo a mi anotación @Min se especifica en el archivo ValidationMessages.properties:

javax.validation.constraints.Min.message=The value of this variable must be less than {value}. 

y esto imprime como era de esperar

The value of this variable must be less than 1 

Lo que me gustaría tener es el mensaje también incluye el nombre de la variable (y la clase) que ha fallado la validación, así como el valor de la variable que falló. Entonces más como.

The value of class.variable was 0 but not must be less than 1 

Cualquier ayuda sería muy apreciada.

Klee

Respuesta

13

Hmmm. ¡Molesto! Tal como lo veo usted tiene 3 opciones:

  1. podría escribir una costumbre MessageInterpolator y sustituir en la configuración de validación, pero eso es parece muy frágil.

  2. Se podría declarar su propia anotación personalizada en el estilo de @Min (see how to do a custom validator here) ...

  3. .. Pero la información que necesita es en realidad llevó a cabo dentro del objeto ConstraintViolation que sale de la Instancia Validator Es solo que no se pone en el mensaje predeterminado.

Supongo que actualmente está utilizando algún tipo de marco web para validar un formulario. Si ese es el caso, debería ser bastante sencillo anular la validación y hacer algo como esto (versión hacky rápida, debería poder hacerlo muy ordenado usando un archivo de propiedades externo):

 
    Set<ConstraintViolation<MyForm>> violations = validator.validate(form); 
    for (ConstraintViolation<MyForm> cv : violations) { 
    Class<?> annoClass = cv.getConstraintDescriptor().getAnnotation().getClass(); 
    if (Min.class.isAssignableFrom(annoClass)) { 
     String errMsg = MessageFormat.format(
     "The value of {0}.{1} was: {2} but must not be less than {3}", 
     cv.getRootBeanClass(), 
     cv.getPropertyPath().toString(), 
     cv.getInvalidValue(), 
     cv.getConstraintDescriptor().getAttributes().get("value")); 
      // Put errMsg back into the form as an error 
    } 
    } 
1

creo que es necesario crear una restricción personalizado.
No ha mencionado qué implementación de la especificación está utilizando, pero hay una buena documentación sobre cómo crear una restricción personalizada para el Validador de Hibernate here.

Parte del proceso implicará la creación de su propia archivo ValidationMessages.properties

Cuestiones relacionadas