décembre
2008
Jeremy Grelle vient d’annoncer officiellement la première milestone de Spring BlazeDS Integration ( annonce ).
Ce projet à pour but de simplifier le développement d’application Flex utilisant un backend Java/Spring.
Jusqu’ici, cette intégration était réalisée via le projet BlazeDS, un projet OpenSource d’Adobe, et cela nécessitait une configuration spécifique.
Pour plus d’information, je vous recommande la lecture de l’article de Franck Ponchel sur l’intégration de Flex 3 et Spring avec le projet Blaze DS.
Dans la suite de ce billet, je vais vous montrer la manière de faire avec Spring Blaze DS Integration.
Configuration du web.xml
La où BlazeDS se base directement sur les servlets, Spring Blaze DS va réutiliser le framework MVC de Spring.
C’est donc une DispatcherServletqui sera utilisée dans le fichier web.xml
<!-- Front Controller de Spring MVC qui va gérer les requêtes Flex -->
<servlet>
<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/config/web-application-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- Mapping des requêtes pour le controlleur Spring -->
<servlet-mapping>
<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
<url-pattern>/messagebroker/*</url-pattern>
</servlet-mapping>
Création des Beans d’infrastructure
La suite de la configuration se fait dans le fichier de configuration de la servlet ( web-application-config.xml dans notre cas ).
La première chose à faire est de configurer le MessageBroker de Flex :
<!-- Factory qui va créer le broker Flex -->
<bean id="flexMessageBroker" class="org.springframework.flex.messaging.MessageBrokerFactoryBean" >
<!-- Configuration du chemin vers le service-config.xml -->
<property name="servicesConfigPath" value="/WEB-INF/config/flex/services-config.xml" />
</bean>
On retrouve ici la configuration du chemin vers le fichier de services, ce qui était fait dans le web.xml lors de l’utilisation normale de BlazeDS.
Il est ensuite nécessaire de configurer un Bean spécial, le MessageBrokerHandlerAdapter. Celui-ci va permettre au MessageBroker de s’intégrer dans l’infrastructure Spring MVC :
<bean class="org.springframework.flex.messaging.servlet.MessageBrokerHandlerAdapter"/>
Exportation d’un service
Il ne reste plus qu’a définir et créer un Bean de type service (sous forme d’un POJO) et de l’exporter grâce à une classe de Spring Blaze DS.
Voici le service :
public interface TuduService {
public List<Tudu> listAll();
}
public class TuduServiceImpl implements TuduService{
@Override
public List<Tudu> listAll() {
List<Tudu> result = new ArrayList<Tudu>();
result.add(new Tudu("tudu1", "Récuperer Spring Flex", "FAIT"));
result.add(new Tudu("tudu1", "Faire un projet d'exemple Spring Flex", "EN COURS"));
result.add(new Tudu("tudu1", "Ecrire un billet sur mon blog", "A FAIRE"));
return result;
}
}
Sa déclaration dans le XML et son exportation :
<bean id="tuduService" class="com.developpez.hikage.springflex.TuduServiceImpl" />
<!-- Exportation du service Tudu sous le nom TuduService -->
<bean id="tudu" class="org.springframework.flex.messaging.remoting.FlexRemotingServiceExporter">
<property name="messageBroker" ref="flexMessageBroker"/>
<property name="service" ref="tuduService"/>
<property name="serviceId" value="tuduService"></property>
</bean>
Le serviceId étant le nom de la destination à utiliser dans le code Flex.
Partie Flex
Dans le services-config, il est nécessaire de bien mettre le channel par défaut dans le remoting-service :
<service id="remoting-service"
class="flex.messaging.services.RemotingService">
<adapters>
<adapter-definition id="java-object" class="flex.messaging.services.remoting.adapters.JavaAdapter" default="true"/>
</adapters>
<default-channels>
<channel ref="my-amf"/>
</default-channels>
</service>
Cela permet ainsi de ne plus devoir créer les destinations une par une, celles-ci étant simplement définie dans la configuration Spring et donc d’utiliser directement le RemoteObject comme ceci :
<mx:RemoteObject destination="tuduService" id="service" />
<mx:Panel width="250" layout="vertical" title="Spring Blaze DS Sample" horizontalAlign="center" verticalAlign="middle">
<mx:VBox width="100%" horizontalAlign="center">
<mx:DataGrid id="datagrid" dataProvider="{service.listAll.lastResult}" width="100%"/>
<mx:Button label="RemoteObject" height="50" click="service.listAll()" width="146" cornerRadius="20"/>
<mx:Spacer/>
</mx:VBox>
</mx:Panel>
Pour rappel, l’attribut destination devant être celui définit (serviceId) dans l’exporter de la configuration Spring.
Et bingo, voici le résultat :
Conclusion
Ca donne un apercu de la simplicité d’utilisation de ce projet. Pour ma part, je verrai bien dans le futur un namespace flex, avec la possibilité d’exporter des services via annotation :
@FlexService(serviceId="tuduService")
public class TuduServiceImpl implements TuduService{
@Override
public List<Tudu> listAll() {
List<Tudu> result = new ArrayList<Tudu>();
result.add(new Tudu("tudu1", "Récuperer Spring Flex", "FAIT"));
result.add(new Tudu("tudu1", "Faire un projet d'exemple Spring Flex", "EN COURS"));
result.add(new Tudu("tudu1", "Ecrire un billet sur mon blog", "A FAIRE"));
return result;
}
}
Je vais d’ailleurs le proposer, du moins si ce n’est pas encore prévu !
Liens
=> Annonce sur le blog de Jeremy Grelle
=> Site du projet
=> Dépôt Subversion du projet Spring-Flex
=> Fisheyes
=> JIRA
=> Forum officiel
C’est Flex Builder qui te créer cela pour tout projet Flex.
Excellent article Hikage
j’ai récupéré tes sources pour tester tout ça et j’ai remarqué qu’il existait un répertoire « html-template ». C’est « Flash-builder » qui l’a créé lors de la compilation?
Merci de partager toute ton expérience en tout cas!
Merci beaucoup c’est très intéressant!!