我在我的应用程序中声明了两个Spring上下文 - 一个用于Spring-MVC请求,另一个用于Flex / BlazeDS消息代理请求,映射到不同的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
内我声明了bean,这些bean特定于flex上下文。但是,当呼叫进入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
没有任何影响。
答案 0 :(得分:3)
如果flex
是DispatcherServlet
,并且出于某种原因您无法遵循TomásNarros的建议,则可以使用DispatcherServlet
获取与当前RequestContextUtils.getWebApplicationContext(request)
相关联的背景信息
还有一种便捷方法RequestContextUtils.getWebApplicationContext(request, ctx)
,如果DispatcherServlet
的一个不可用,它会返回根上下文。
答案 1 :(得分:2)
将自定义组件声明为Spring Context aware:
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
public MyCustomBean implements ApplicationContextAware {
private ApplicationContext springContext;
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
springContext = applicationContext;
}
public ISerializer getSerializer(Object source,boolean useAggressiveSerialization)
{
String serializerBeanName = springContext.getBeanNamesForType(ISerializer.class);
}
}
在bean初始化时,Spring将访问bean的setApplicationContext
方法,作为参数传递它正在创建的上下文。在那里,您可以随时使用它。
答案 2 :(得分:0)
Hrmmmm .....我在Spring / Flex应用程序中使用Spring / Flex集成,几乎只有一个应用程序上下文。这可能是问题吗?您在Flex上下文文件中声明的bean不在MVC上下文文件中,并且它们实际上没有被加载?