我在应用程序中声明了两个Spring上下文-一个用于Spring-MVC请求,另一个用于Flex / BlazeDS messagebroker请求,它们已映射到不同的url模式:
<servlet-mapping>
<servlet-name>spring-mvc</servlet-name>
<url-pattern>/app/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>flex</servlet-name>
<url-pattern>/messagebroker/*</url-pattern>
</servlet-mapping>
有一个声明的通用上下文配置(/WEB-INF/applicationContext.xml),然后两个上下文分别在spring-mvc-servlet.xml和flex-servlet.xml中声明了自己的配置.
在flex-servlet.xml内部,我声明了特定于flex上下文的bean.但是,当有电话到http:// localhost / messagebroker / *时,我收到错误消息,指出这些bean不可用.
有问题的代码在自定义Spring组件内部,因此直接引用WebApplicationContext即可访问声明的bean:
public ISerializer getSerializer(Object source,boolean useAggressiveSerialization)
{
ServletContext ctx = FlexContext.getServletContext();
WebApplicationContext springContext = WebApplicationContextUtils.getrequiredWebApplicationContext(ctx);
String serializerBeanName = springContext.getBeanNamesForType(ISerializer.class);
}
当我在单个上下文中运行时,此方法有效.但是,它还需要支持在运行多个上下文的地方.
设置一个断点,我看到springContext的值是根上下文,只有一个configLocation-/WEB-INF/applicationContext.xml
我假设这是问题所在-因为上述代码所需的ISerializer在flex-servlet.xml中声明.
如何修改以上代码以支持这两种情况? (单个上下文和多个上下文)?
编辑:
上面显示的代码位于ManageableComponentFactoryBean内部,该位置似乎是作为自定义bean工厂运行的.似乎在生成的类上不支持ApplicationContextAware接口.例如:
<bean id="dpHibernateRemotingAdapterComponentFactory"
class="org.springframework.flex.core.ManageableComponentfactorybean">
<constructor-arg
value="org.dphibernate.adapters.RemotingAdapter" />
<property name="properties">
<value>
{"dpHibernate" :
{
"serializerFactory" : "org.dphibernate.serialization.SpringContextSerializerFactory"
}
}
</value>
</property>
</bean>
上面引用的代码位于org.dphibernate.serialization.SpringContextSerializerFactory内部.使此SpringContextSerializerFactory实现ApplicationContextAware没有影响.
解决方法:
如果flex是dispatcherServlet,并且由于某种原因您不能遵循TomásNarros的建议,则可以使用RequestContextUtils.getWebApplicationContext(request)获得与当前dispatcherServlet关联的上下文.
还有一个便捷的方法RequestContextUtils.getWebApplicationContext(request,ctx),如果dispatcherServlet的根上下文不可用,它将返回根上下文.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。