Intégrer GWT & Spring
De base le toolkit GWT vient avec son framework d'échange : GWT-RPC. Aucun problème particulier dans son fonctionnement mais quelques limitations à la fois dans la configuration que l'on pourra qualifier d'un "peu lourde", ainsi que dans l'intégration avec un existant (typiquement un existant Spring). Le framework gwtrpc-spring répond à ces limitations, il faut bien l'avouer, de façon trés élégante.
Configuration de la partie Serveur : une simple exposition de beans Spring Exposer un service GWT-RPC nécessite deux choses :
- L'implémentation du service doit hériter de RemoteServiceServlet
- La servlet associée à chaque service doit être configurée dans le web.xml
Peu de choses a priori mais autant de défauts potentiels qui ne seront détectés qu'au déploiement et qui, au final, freinent la productivité.
gwtrpc-spring propose un fonctionnement un peu plus générique (une documentation plus complète est disponible sur le site) :
une servlet de type "Dispatcher" unique à configurer dans le fichier web.xml.
... <servlet -mapping> </servlet><servlet -name>dispatcher</servlet> <url -pattern>*.rpc</url> ...
tout bean Spring peut être alors exposé via l'annotation @Service. Vous noterez que l'implémentation du service n'hérite pas de RemoteServiceServlet. Il est possible d'avoir les mêmes API via la classe statique RemoteServiceUtil.
@Service public class GreetingServiceImpl implements GreetingService {
la configuration Spring associée peut être générique
... <context :annotation-config /> <context :component-scan base-package="org.octo.myapp.server" /> ...
Ainsi configurés, toutes les appels sur des urls se terminant par *.rpc seront "dispatchés" vers le "bon" bean Spring ie. l'implémentation du contrat de service.
Configuration de la partie Cliente : du GWT, simplement L'élégance de ce framework tient en partie dans son intégration transparente dans la partie cliente. En effet:
l'interface de service utilise toujours et uniquement les annotations GWT.
@RemoteServiceRelativePath("greet.rpc") public interface GreetingService extends RemoteService {
la création du service via l'API GWT.create() est identique
greetingService = GWT.create(GreetingService.class);
En bref, un framework simple et élégant...