2011-03-02 7 views
7

Tengo una aplicación web en la que defino el contexto básico dispatcher-servlet en web.xml y carga el applicationContext.Mover messageSource a applicationContext hace que el mensaje predeterminado Source no sea visible en el contexto servlet-dispatcher

Tenía messageSource definido en dispatcher-servlet y lo estaba inyectando a los controladores muy bien.

También tengo mis servicios definidos en applicationContext y los puedo inyectar en mis controladores (definidos en el contexto dispatcher-servlet).

Pero cuando moví la definición para messageSource a la applicationContext por lo que algunos servicios podrían resolver mensajes dispatcher-servlet el contexto muestra que no es la búsqueda de un grano de messageSource y se utiliza el valor por defecto, por lo que los controladores de obtener el grano mal inyectado.

¿Alguna idea de por qué la definición messageSource en applicationContext no sería visible para el contexto dispatcher-servlet?


veo que mi grano de MessageSource se carga en la sección applicationContext de los registros:

2058 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'messageSource' 
2058 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating instance of bean 'messageSource' 
... 
2082 [main] DEBUG org.springframework.web.context.support.XmlWebApplicationContext - Using MessageSource [mycommons.spring.ResourceBundleMessageSourceWithDefaultResolution: basenames=[messages]] 


que ver este registro en la carga de dispatcher-servlet:

3858 [main] DEBUG org.springframework.web.context.support.XmlWebApplicationContext - Unable to locate MessageSource with name 'messageSource': using default [[email protected]1ed3] 

Respuesta

11

Este es solo la forma en que funciona El messageSource bean obligada se define en el contexto en el que se va a utilizar. No será "heredado" del contexto principal al hijo.

Esto es un poco de una vuelta a los primeros días de la primavera 1.x, y realmente nunca se ha cambiado desde entonces.

Hay una serie de "frijoles mágicos" que debe ser residente directamente en la appcontext servlet, y este es uno de ellos.

+0

Aha, esa magia de primavera me atrapa a veces. :) ¡Gracias! ¿Conoces la mejor solución? ¿O solo necesito separar los mensajes que usarán los controladores de aquellos que pueden ser utilizados por los servicios? –

+1

@David: puede separarlos, o poner la definición de bean 'messageSource' en un archivo XML separado, e incluirlo (usando' ') donde sea necesario. – skaffman

+0

Supongo que al agregar tanto para dispatcher-servlet como para applicationContext creará dos copias del messageSource bean. –

1

Hoy he encontrado "otra" solución que funciona (para mí funciona en la primavera de 3,1 pero supongo que funcionará en versiones anteriores, así, el atributo padre ha existido desde hace un tiempo). Todavía creará 2 frijoles, pero no requiere que añadir toda la definición de frijol por segunda vez en el archivo xxx-servlet.xml:

En su applicationContext.xml:

<bean id="baseMessageSource" class="org.springframework...YourMessageSourceClass"> 
    ... 
</bean> 

En su XXX- servlet.xml:

<bean id="messageSource" parent="baseMessageSource" /> 

la segunda referencia será simplemente "clon" del grano de la base de su contexto de aplicación y ponerla a disposición de sus servlet/controladores, etc. de esta manera, incluso se puede anular partes de la configuración fuente del mensaje en el servlet.

Cuestiones relacionadas