2009-12-10 9 views
19

Estoy intentando escribir validators en el marco Spring MVC, pero hay una omisión evidente en la documentación. Al llamar al pasar un error al objeto Errors, la mayoría de los métodos esperan un parámetro String llamado errorCode. Estos códigos de error, si entiendo correctamente, sirven como bases para mensajes de error específicos. Pero no puedo por la vida averiguar dónde se asignan estos códigos.¿Dónde se resuelven los códigos de error de validación Spring MVC?

Aquí hay un ejemplo de lo que me refiero a Spring MVC's Javadoc;

public class UserLoginValidator implements Validator { 

    private static final int MINIMUM_PASSWORD_LENGTH = 6; 

    public boolean supports(Class clazz) { 
     return UserLogin.class.isAssignableFrom(clazz); 
    } 

    public void validate(Object target, Errors errors) { 
     ValidationUtils.rejectIfEmptyOrWhitespace(errors, "userName", "field.required"); 
     ValidationUtils.rejectIfEmptyOrWhitespace(errors, "password", "field.required"); 
     UserLogin login = (UserLogin) target; 
     if (login.getPassword() != null 
      && login.getPassword().trim().length() < MINIMUM_PASSWORD_LENGTH) { 
      errors.rejectValue("password", "field.min.length", 
       new Object[]{Integer.valueOf(MINIMUM_PASSWORD_LENGTH)}, 
       "The password must be at least [" + MINIMUM_PASSWORD_LENGTH + "] characters in length."); 
     } 
    } 
} 

¿Alguien me puede aclarar?

Respuesta

15

Estoy usando la resolución de mensajes predeterminada.

En mi dispatcher-servlet.xml, tengo

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> 
    <property name="basename" value="messages" /> 
</bean> 

y luego en el nivel superior de mi directorio clases Tengo un archivo de texto llamado "messages.properties" que contiene asignaciones como este:

error.firstname.null=Please enter your first name. 
error.lastname.null=Please enter your last name. 

Si desea utilizar un MessageCodesResolver personalizado, puede implementar la interfaz MessageCodeResolver y luego definir su resolver para un controlador dado como este:

<bean id="myController"> 
    <property name="messageCodesResolver" ref="myMessageCodesResolver" /> 
</bean> 

Actualmente no existe una forma de definir un MessageCodeResolver personalizado a nivel mundial; hay un enhancement request for that here. Un enfoque que utiliza la herencia de bean para hacer que todos los beans del controlador hereden de una definición de bean controlador, se describe here.

+0

Gracias por la información, esto me da suficiente para hacer uso de mi validador. Pero con el interés de saber qué haría si quisiera volver a conectar un MessageCodeResolver personalizado, ¿a dónde iría? También solo por la prosperidad, el javadoc de ResourceBundleMessageSource está en http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/context/support/ResourceBundleMessageSource.html. –

+1

Si desea utilizar un MessageCodeResolver personalizado, puede asignar uno para un controlador determinado. Un enfoque, entonces, es utilizar la herencia de bean para hacer que todos los beans del controlador hereden de una definición de bean de controlador, como se describe aquí: http://forum.springsource.org/showthread.php?t=46336 No hay actualmente una manera para definir un MessageCodeResolver personalizado globalmente; hay una solicitud de mejora aquí: https://jira.springsource.org/browse/SPR-5187 –

+1

Como referencia, la característica global personalizada 'MessageCodeResolver' se implementó finalmente en Spring 3.1 (2011). Ver también [SPR-6506] (https://jira.spring.io/browse/SPR-6506). – vallismortis

3

Se resuelven con MessageSource y MessagesCodeResolver.

Here es la sección correspondiente en el manual de referencia:

Emisión de mensajes correspondientes a los errores de validación es la última cosa que necesitamos discutir. En el ejemplo que mostramos arriba, rechazamos el nombre y el campo de edad. Si vamos a generar los mensajes de error utilizando MessageSource, lo haremos utilizando el código de error que hemos dado al rechazar el campo ('nombre' y 'edad' en este caso). Cuando llame (ya sea directa o indirectamente, utilizando por ejemplo la clase ValidationUtils) rejectValue o uno de los otros métodos de rechazo de la interfaz Errors, la implementación subyacente no solo registrará el código que ha pasado, sino también una cantidad de códigos de error adicionales.

+0

¿Dónde definir lo MessageCodeResolver a utilizar? –

+0

se usa una instancia predeterminada (DefaultMessageCodesResolver) si no especifica uno. Debería simplemente registrar un MessageSource y eso se usará automáticamente. –

+0

¿Cómo se registra un MessageSource? Veo messageCodesResolver como propiedad de bean. Pero, ¿hay alguna manera de establecer un MessageCodeResolver como universal en toda la aplicación? –

1

Por alguna razón, si desea resolver los mensajes en el controlador similar para formar: Los errores JSP etiquetas a continuación, puede hacer lo siguiente:

//result is BindingResult 
    List<String> errors = new ArrayList<String>(); 
    List<ObjectError> allErrors = result.getAllErrors(); 
    for (ObjectError error : allErrors) { 
     String message = messageSource.getMessage(error, null); 
     errors.add(message); 
    } 
+0

Quiero señalar que MessageSource puede ser @Autowired en el controlador – leojh

Cuestiones relacionadas