2010-10-07 5 views
3

J'ai deux contextes de printemps déclarés dans ma demande - un pour les demandes Spring MVC, et une autre pour les demandes Flex/BlazeDS de messagebroker, mis en correspondance avec différents modèles-url:Spring: Accès à la WebApplicationContext correcte avec plusieurs distributeurs déclaré

<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> 

Une configuration de contexte commun est déclarée, (/WEB-INF/applicationContext.xml), puis chacun des deux contextes a ses propres configurations déclarées en spring-mvc-servlet.xml et flex-servlet.xml respectivement.

Intérieur flex-servlet.xml J'ai déclaré des haricots qui sont spécifiques au contexte flexible. Cependant, quand un appel arrive à http://localhost/messagebroker/* je reçois des erreurs que ces haricots ne sont pas disponibles.

Le code en question est à l'intérieur d'un composant personnalisé ressort, donc des références directement le WebApplicationContext afin d'accéder aux haricots déclarés:

public ISerializer getSerializer(Object source,boolean useAggressiveSerialization) 
{ 
    ServletContext ctx = FlexContext.getServletContext(); 
    WebApplicationContext springContext = WebApplicationContextUtils.getRequiredWebApplicationContext(ctx); 
    String serializerBeanName = springContext.getBeanNamesForType(ISerializer.class); 
} 

Cette approche fonctionne quand je suis en cours d'exécution avec un seul contexte. Cependant, il doit également prendre en charge les contextes multiples en cours d'exécution.

Définition d'un point d'arrêt, je vois que la valeur de springContext est le contexte racine, avec un seul configLocation - /WEB-INF/applicationContext.xml

J'asssuming que c'est le problème - comme ISerializer que le code ci-dessus exige est déclarée en flex-servlet.xml. Comment modifier le code ci-dessus pour prendre en charge les deux scénarios?

Comment modifier le code ci-dessus pour prendre en charge les deux scénarios? (Contexte unique et contextes multiples)?

EDIT: Le code ci-dessus se trouve dans un ManageableComponentFactoryBean, qui semble fonctionner comme une usine de haricots personnalisé. Il semble que l'interface ApplicationContextAware n'est pas honorée sur les classes générées. Par exemple:

<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> 

Le code cité ci-dessus se trouve à l'intérieur du org.dphibernate.serialization.SpringContextSerializerFactory. La réalisation de cet outil SpringContextSerializerFactoryApplicationContextAware n'a aucun impact.

Répondre

3

Si flex est un DispatcherServlet, et pour une raison quelconque vous ne pouvez pas suivre la suggestion de Tomás Narros, vous pouvez obtenir un contexte associé à la DispatcherServlet actuelle à l'aide RequestContextUtils.getWebApplicationContext(request).

Il existe également une méthode pratique RequestContextUtils.getWebApplicationContext(request, ctx), qui renvoie le contexte racine si celui de DispatcherServlet n'est pas disponible.

+0

un bon utilisateur à savoir, +1 – Bozho

+0

Cela a fait l'affaire! Merci beaucoup –

+0

+1. Assez utile dans certains environnements. @Marty: si cela a résolu votre question, acceptez la réponse axtavt. –

1

Déclarez votre componente personnalisé comme contexte de printemps conscient:

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); 
    } 
} 

A l'initialisation du haricot, Spring accédera à la méthode setApplicationContext de votre haricot, en passant comme argument le contexte dans Wich il est en cours de création. Là, vous pouvez le garder un usage quand vous en avez besoin.

+0

bon point, +1. – Bozho

+0

Bonne suggestion - merci. Malheureusement, cela ne semble pas fonctionner. J'ai mis à jour la question originale avec la configuration pertinente liée à ce problème. –

0

Hrmmmm ..... J'ai presque exactement ce type de déclaration dans mon application Spring/Flex, en utilisant l'intégration Spring/Flex et il n'y a qu'un seul contexte d'application. Est-ce que cela pourrait être le problème?Vous avez des beans déclarés dans le fichier de contexte Flex qui ne sont pas dans le fichier de contexte MVC, et ils ne sont pas vraiment chargés?

+0

Salut. L'aspect critique ici est qu'il y a deux répartiteurs - pour de bonnes raisons. L'un achemine les requêtes Spring-MVC, les autres requêtes Flex de courtier de messages. Les deux sont séparés de sorte que le routage ne s'interpère pas les uns avec les autres. –

+0

Avec Spring BlazeDS, vous pouvez utiliser Spring MVC DispatcherServlet pour gérer les requêtes AMF/Flex. Je ne sais pas pourquoi vous avez besoin de deux contextes différents. –

Questions connexes