2012-06-20 23 views
6

Intentando que la internacionalización de Spring funcione. He utilizado classpath: message nombrebase, archivos creados .properties para idiomas. Están siendo copiados corectly a la carpeta web-inf y los códigos existen dentro del archivo de propiedades ...Causado por: org.springframework.context.NoSuchMessageException: No se encontró ningún mensaje con el código

Aquí está la idea que muestra todo, por favor ayúdenme. He copiado la configuración de otro proyecto que he hecho que funciona bien. He intentado crear una carga de archivos de mensajes diferentes, pero no está recogiendo nada ... la imagen muestra web.xml, spring-servlet.xml y la estructura del directorio.

This shows everything, I can't see what I am missing

Editar Si añado la definición de frijol a applicationContext en lugar de primavera-servlet funciona ..?

Respuesta

11

Iré por mi intento:

Si el archivo se encuentra bajo el directorio WEB-INF/classes, probar:

<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> 
    <property name="basename" value="WEB-INF/classes/messages" /> 
</bean> 

Y el nombre del archivo debe ser:

  • messages.properties
  • messages_en.properties
  • messa ges_en_GB.properties

Editar - Final try!

¿Qué pasa con esta forma de escribir la configuración, huelo sthg aquí después de su último comentario:

<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> 
    <property name="basename" value="classpath:messages" /> 
    <property name="defaultEncoding" value="UTF-8" /> 
</bean> 
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver"> 
    <property name="defaultLocale" value="en" /> 
</bean> 

<mvc:interceptors> 
    <bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"> 
     <property name="paramName" value="lang" /> 
    </bean> 
</mvc:interceptors> 
+0

ya lo intenté, pero lo intentaré de nuevo.Y sí, probé ese archivo de propiedades (en la captura de pantalla), aunque messages_en.properties funciona en mi otro proyecto. – NimChimpsky

+0

Trate de mantener solo uno de ellos en su directorio? –

+0

He estado mirando esto durante demasiado tiempo. Va a ser algo tan pequeño y molesto – NimChimpsky

3

Mantenga sus archivos de propiedades de mensaje fuera de la ruta de clases (WEB-INF/classes) y definir el grano de la siguiente manera

<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> 
<property name="basename" value="/WEB-INF/messages"/> 
<property name="cacheSeconds" value="1"/> 

Según el documento proporciona ReloadableResourceBundleMessageSource se beneficiará de cambiar los mensajes sobre la marcha lo que la primavera va a buscar throu gh los cachSeconds. Esta clase difiere de ResourceBundleMessageSource solo al especificar la ubicación del recurso.

+0

Ya estoy usando ReloadableResourceBundleMessageSource. – NimChimpsky

+0

Sí, por eso es necesario mantener los archivos de propiedades fuera del classpath, como ya he mencionado. \ –

+0

No creo que sea correcto. Mis otros proyectos y las otras respuestas aquí funcionan bien. Pero lo intentaré, y estaré eternamente agradecido si es correcto – NimChimpsky

0

Todos los detalles de la configuración son correctos, pero una cosa es que los archivos de propiedades estén configurados en el archivo de configuración secundaria significa que spring-servlet.xml configura todas las propiedades en applicationContext.xml. Esto significa que el archivo de configuración principal funcionará. pruébalo y elimina la configuración de los detalles de la propiedad en spring-servlet.xml ...........

-1

Aunque para muchos esto suena tonto, pero el error que cometía mi código era que habíamos escrito nuestro propio MessageSource . Que estaba llamando a Spring's MessageSource.

Pero en el código era como (MessageSource (MessageSource)). Por lo tanto, estábamos mirando hacia arriba sobre la búsqueda.

Se ha eliminado la llamada adicional, y está funcionando ahora.

Cuestiones relacionadas