2012-04-30 19 views
8

Primero, déjenme explicarles que estoy usando Spring MVC 3.1.1, y la validación de Hibernate 4.2.0. Estoy usando anotaciones de validación para varios formularios en mi aplicación Spring. Desde mi aplicación necesita ser localizado, he estado usando un paquete de recursos para mis mensajes de validación que se ve algo como esto:¿Cómo puedo hacer que Spring muestre diferentes mensajes de validación basados ​​en paquetes para el mismo validador en una clase?

# ValidationMessages.bundle 
FieldMatch=Password and confirmation must match. 

La definición de la clase correspondiente para este mensaje tiene el siguiente aspecto:

@FieldMatch.List({ 
    @FieldMatch(first = "password", second = "passwordConfirmation") 
}) 
public class RegistrationForm { 
    // ... 
} 

Tengo este conjunto de recursos personalizado configurado en mi appContext.xml, y mis mensajes se muestran en el formulario sin ningún problema.

Aquí está mi dilema, sin embargo. Hay un nuevo requisito que debo confirmar que coinciden más campos. Ahora mismo estoy confirmando que coinciden dos campos de contraseña. Ahora mi requisito es que también tengo que confirmar la dirección de correo electrónico. Sé que este es un requisito tonto, pero no puedo cambiarlo. Así que ahora la definición de clase se verá así:

@FieldMatch.List({ 
    @FieldMatch(first = "password", second = "passwordConfirmation") 
    @FieldMatch(first = "email", second = "emailConfirmation") 
}) 
public class RegistrationForm { 
    // ... 
} 

Claramente, mi paquete de recursos actual no va a funcionar porque necesito dos mensajes independientes (uno para cada partido). Intenté usar message="{emails.must.match}" y luego definir ese mensaje en el paquete de recursos, pero en realidad nunca muestra el mensaje, solo muestra el texto real {email.must.match}.

Entonces, después de todo eso, mi pregunta es simple: ¿Cómo puedo hacer que cada uno de esos validadores FieldMatch en el nivel de clase tenga un mensaje diferente que esté definido en un paquete de recursos para que pueda ser localizado?

¡Gracias de antemano por cualquier ayuda!

[EDITAR] Para los curiosos, this es el validador FieldMatch que estoy usando.

ACTUALIZACIÓN 5/23/2012 Esta es la definición de frijol otros han pedido:

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> 
    <property name="basenames"> 
     <list> 
      <value>ErrorBundle</value> 
      <value>ForgotPasswordBundle</value> 
      <!-- etc etc --> 
     </list> 
    </property> 
</bean> 

<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> 
    <property name="validationMessageSource" ref="messageSource"/> 
</bean> 

Respuesta

1

Casos como este suelen activar algo que el OP no incluyó en la pregunta. Supongo que esto se debe a que si la solución fuera simple o estuviera causada por algo que el OP creía que era causado por ellos, no tendrían ningún problema. Sin juicio; Lo he hecho.

Así que presento los pasos de solución de problemas en lugar de una solución completa, porque en base a lo que ha dicho, debería funcionar.

Primero, vamos a comprobar que no se trata de un problema de interpolación extraño y prueba message="{emails-must-match}".

Si eso no funciona, bueno, parece que solía tener ValidationMessages.properties funcionando. Me gustaría volver a eso (eliminar <property name="validationMessageSource" ref="messageSource"/> de la configuración del validador) y ver si puede obtener message="{emails.must.match}" para trabajar con emails.must.match definido en ValidationMessages.properties. Si eso aún no funciona, regrese al mensaje predeterminado que tenía usando la clave FieldMatch y vea si recibe ese mensaje para ambas condiciones de error.

Eso ayudará a localizar el problema.

+0

Esto me puso en el camino correcto. Mi paquete en realidad no se llamaba 'ValidationMessages.properties' sino 'ValidationBundle.properties' - cuando renombré el archivo, todo funcionó y obtuve la cadena adecuada. ¡Aclamaciones! –

0

Cuál es la clave del mensaje en su paquete de recursos? Debe ser "emails.must.match" (es decir, sin las llaves requeridas para el atributo message de la restricción).

+0

Me he asegurado de que los nombres coincidan exactamente sin suerte. Simplemente muestra la versión de llavero. –

+1

¿Puedes publicar cómo configuraste tu validador (contexto de la aplicación)? ¿Estás usando 'LocalValidatorFactoryBean'? Además, ¿dónde se encuentra el paquete de mensajes? ¿Se llama ValidationMessages.properties? – Gunnar

1

FieldMatch está utilizando un validador JSR-303 (javax.validation.Validator), no un validador de primavera (org.springframework.validation.Validator). ¿Usted config la fuente del mensaje como:

<!-- JSR-303 --> 
<bean id="validator" 
    class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> 
    <property name="validationMessageSource" ref="messageSource"/> 
</bean> 

y por supuesto la correspondiente messageSource?

+0

ver actualizaciones arriba :) –

Cuestiones relacionadas