В моем приложении объявлено два контекста 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
У меня есть объявленные 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 , который работает как фабрика пользовательских компонентов.Кажется, что интерфейс 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
не оказывает никакого влияния.