微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java-Spring:使用声明的多个调度程序访问正确的WebApplicationContext

我在应用程序中声明了两个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] 举报,一经查实,本站将立刻删除。

相关推荐