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