Java 将messageSource移动到applicationContext会导致默认messageSource在dispatcher servlet上下文中不可见

Java 将messageSource移动到applicationContext会导致默认messageSource在dispatcher servlet上下文中不可见,java,spring-mvc,Java,Spring Mvc,我有一个webapp,在其中我在web.xml中定义了基本的dispatcherservlet上下文,并加载applicationContext 我在dispatcherservlet中定义了messageSource,并将其注入控制器 我也在applicationContext中定义了我的服务,我可以将它们注入控制器(在dispatcherservlet上下文中定义) 但是当我将messageSource的定义移动到applicationContext以便某些服务可以解析消息时,dispatc

我有一个webapp,在其中我在web.xml中定义了基本的
dispatcherservlet
上下文,并加载
applicationContext

我在
dispatcherservlet
中定义了
messageSource
,并将其注入控制器

我也在
applicationContext
中定义了我的服务,我可以将它们注入控制器(在
dispatcherservlet
上下文中定义)

但是当我将
messageSource
的定义移动到
applicationContext
以便某些服务可以解析消息时,
dispatcherservlet
上下文显示它没有找到
messageSource
bean,并且正在使用默认值,因此控制器得到了错误的bean

知道为什么
applicationContext
中的消息源定义对
dispatcherservlet
上下文不可见吗?


我看到我的MessageSourcebean被加载到日志的
applicationContext
部分:

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]]

我在加载
dispatcher servlet
时看到此日志:

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

这就是它的工作方式。
messageSource
bean必须在使用它的上下文中定义。它不会从父上下文“继承”到子上下文

这有点像是回到了Spring1.x的早期,从那以后就再也没有改变过

有许多“魔豆”必须直接驻留在servlet appcontext中,这就是其中之一。

今天我找到了“另一个”可行的解决方案(对我来说,它在Spring 3.1中可以工作,但我认为它在早期版本中也可以工作,父属性已经存在了一段时间)。它仍将创建2个bean,但不需要您在xxx-servlet.xml文件中再次添加整个bean定义:

在applicationContext.xml中:

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

...
在xxx-servlet.xml中:

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


第二个引用将简单地从应用程序上下文“克隆”基本bean,并使其可用于servlet/控制器等。这样,您甚至可以覆盖servlet中的部分消息源配置。

Aha,spring magic有时会让我着迷。:)谢谢你知道最好的解决办法吗?或者我只需要将控制器使用的消息与服务可能使用的消息分开吗?@David:您可以将它们分开,或者将
messageSource
bean定义放在一个单独的XML文件中,并将其包括在内(使用
)我假设将添加到dispatcher servlet和applicationContext将创建messageSource bean的两个副本。@David是的,会的。不过这应该是无害的。您可以通过调用
delegatingMessageSource.getParentMessageSource()