Article publié par Nicolas Jozwiak le 29 juillet 2009.
Catégorie(s) : Java / JEE, RIA
Récemment, lors d’une intervention sur une application Flex, j’ai été confronté à un problème de migration d’une version de la librairie Spring BlazeDS Integration (passage de la version 1.0.0.RC2 à 1.0.0.M2). Cette librairie permet la configuration de BlazeDS à travers Spring de façon simplifiée. J’ai voulu configurer un appel à un service Java en Remoting.
Afin de déclarer votre service Remote, les lignes suivantes doivent être ajoutées dans votre applicationContext.xml :
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <value> /*=mySpringManagedMessageBroker </value> </property> </bean> <!-- Envoie les requêtes au "message broker" --> <bean class="org.springframework.flex.servlet.MessageBrokerHandlerAdapter"/> <!-- Le MessageBroker de BlazeDs --> <bean id="mySpringManagedMessageBroker" class="org.springframework.flex.core.MessageBrokerFactoryBean" /> <!-- Service myService --> <bean id="myService" class="com.xebia.impl.MyServiceImpl" /> <flex:remoting-destination message-broker="mySpringManagedMessageBroker" destination-id="myServiceDest" ref="myService" />
Ainsi que la référence au fichier xsd : http://www.springframework.org/schema/flex/spring-flex-1.0.xsd
Malheureusement, au démarrage de votre application, vous aurez cette erreur :
org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 67 in XML document from ServletContext resource [/WEB-INF/classes/applicationContext-service.xml] is invalid;
nested exception is org.xml.sax.SAXParseException: cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element 'flex:remoting-destination'.
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:390)
Pourtant cela fonctionnait parfaitement avec les versions précédentes de Spring BlazeDS Integration …
Je regarde donc le fichier xsd sur lequel se base mon applicationContext (http://www.springframework.org/schema/flex/spring-flex-1.0.xsd), et le remoting-destination est bien présent… étrange. Je regarde également la documentation du projet et d’après cette dernière, ma configuration est bonne … le mystère s’épaissit.
Après quelques recherches, j’ai l’idée de regarder le xsd du jar de Spring BlazDS Integration (org.springframework.flex-1.0.0.M2.jar). Et eureka, je trouve l’explication : le xsd du jar n’est pas le même que celui vers lequel pointe mon applicationContext… Au chargement de l’application, c’est le xsd du jar qui est recherché… De plus, je me rends compte que cette version a subi un peu de refactoring et certains chemins ont été modifiés.
Par conséquent, vous devez déclarer votre service Remote de cette manière :
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <value> /*=mySpringManagedMessageBroker </value> </property> </bean> <!-- Envoie les requêtes au "message broker" --> <bean class="org.springframework.flex.messaging.servlet.MessageBrokerHandlerAdapter"/> <!-- Le MessageBroker de BlazeDs --> <bean id="mySpringManagedMessageBroker" class="org.springframework.flex.messaging.MessageBrokerFactoryBean" /> <!-- Service myService --> <bean id="myService" class="com.xebia.impl.MyServiceImpl" /> <flex:remote-service message-broker="mySpringManagedMessageBroker" service-id="myServiceDest" ref="myService" />
Vous remarquerez que remoting-destination et destination-id sont devenus remote-service et service-id et que les chemins des classes MessageBrokerHandlerAdapter et MessageBrokerFactoryBean ont changé.
Néanmoins, une solution plus rapide consiste à effectuer une montée de version vers la 1.0.0.RELEASE de Spring BlazeDS Integration. En effet, le fichier xsd ainsi que les chemins ont été remis comme la version RC2, posant ainsi moins de problèmes.
En espérant que cette solution puisse aider d’autres personnes !


Complet
Twitter







Merci pour votre article !
Same problem solved swaping
http://www.springframework.org/schema/flex/spring-flex-1.0.xsd
to
http://www.springframework.org/schema/flex/spring-flex-1.5.xsd
with spring flex 1.5