Bonjour,
Voici les spécifications de mon application :
- Gwt 2.0
- Spring
- Hibernate
- Gxt
Datamodel
J'ai un ensemble de classe qui représente mon modèle de données, ces classes se trouvent dans le package a.b.c.d.core.datamodel . Ces classes sont également utilisées côté Web, pour cela j'ai
- Créer un fichier core.gwt.xml dans lequel source="datamodel"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 <!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 1.6//EN" "http://google-web-toolkit.googlecode.com/svn/releases/1.6/distro-source/core/src/gwt-module.dtd"> <module> <source path='a/b/c/d/core/datamodel'/> <set-property name="user.agent" value="gecko1_8"/> </module>- Fait hérité mon module principal du module core
Code : Sélectionner tout - Visualiser dans une fenêtre à part <inherits name="core"/>
Spring
Pour l'intégration de Spring, j'ai opté pour la solution la moins couteuse en code que j'ai pu trouvé : spring4gwt.
J'ai donc un package a.b.c.d.dao qui contient l'ensemble des classes possédant les méthodes d'accès au données (save/update/getAll...).
Ces dao sont renseignés dans le fichier spring-core.xml
Pour exposer ces beans à mes services, j'ai
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="mySessionFactory"/> <property name="dataSource" ref="myDataSource"/> </bean> <bean id="classADao" class="a.b.c.d.core.dao.classADao"> <property name="sessionFactory" ref="mySessionFactory"/> </bean> <bean id="classBDao" class="a.b.c.d.core.dao.classBDao"> <property name="sessionFactory" ref="mySessionFactory"/> </bean>
- Transformer mon service
Le service n'hérite plus de RemoteService.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 @Service("crcService") @Transactional(readOnly = true) public class MyModuleServiceImpl implements CRCService { @Resource private ClassADao classADao; @Resource private ClassBDao classBDao;
Le fichier spring-web-config.xml
Permet de renseigner les classes qui seront utilisées comme service, en l'occurence le package server.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 <context:component-scan base-package="a.b.c.d.web.server"/> <tx:annotation-driven transaction-manager="transactionManager"/>
web.xml
Ici on trouve un mapping et on voit que pour les appels de services la servlet de spring4gwt prendra la main.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <!-- Spring context --> <context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath:/spring-prod.xml classpath:/spring-config-core.xml classpath:/spring-config-web.xml /WEB-INF/applicationContext.xml </param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- Spring4Gwt servlet --> <servlet> <servlet-name>springGwtRemoteServiceServlet</servlet-name> <servlet-class>org.spring4gwt.server.SpringGwtRemoteServiceServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>springGwtRemoteServiceServlet</servlet-name> <url-pattern>/crc/springGwtServices/*</url-pattern> </servlet-mapping> </web-app>
Un exemple de code de ma classe MyServiceImpl
Tout cela fonctionnait tant que je n'utilisait que des objets "simples" dans le sens ou ce n'étaient pas des objets qui contenaient des listes d'autres objets.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 @Transactional(readOnly = false) public List<FoodType> getAllFoodType() { return foodTypeDao.getAll(); }
Ainsi je suis confronté au problème que les objets que j'utilise sont modifiés par hibernate qui rajoute des proxies et autres données qui pose problème à Gwt
Liens intéressants
http://hugo.developpez.com/tutoriels...-et-hibernate/
http://noon.gilead.free.fr/gilead/index.php?page=gwt
http://gwt-widget.sourceforge.net/?q=node/51#Overview
Donc pour parer ce problème, 2 grandes solutions :
- Les DTO (data transfert object)
- Gilead (librairie qui "fait le travail à notre place")
Je souhaite donc utiliser Gilead en modifiant le moins possible mon application.
Je tente donc de suivre les explications fournies par le site de gilead
- Je télécharge gilead-1.3.0.1169.zip
- Les jars contenus dans le zip, dois-je tous les ajouter dans mes libs ? (comet4gwt,gilead4blazeds,gilead-actionscript,gilead4gwt,gilead-core,gilead-hibernate) Dans le doute je n'ajoute que les 3 derniers jars qui me semblent être ce dont j'ai besoin
- faire hériter toutes les classes de mon datamodel de LightEntity, lorsque je veux hériter de cette classe j'ai le choix entre plusieurs packages (java14,gwt,java5.legacy ou java5), lequel choisir ?
- ajouter un héritage dans le module.gwt.xml :
Ce code la ne fonctionne pas chez moi
Code : Sélectionner tout - Visualiser dans une fenêtre à part <inherits name='net.sf.gilead.Adapter4Gwt15'/>
Celui-ci fonctionne, faut-il un des 2, les 2 ? sont-ils tout à fait différents ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part <inherits name='net.sf.gilead.Gilead4Gwt'/>
- Faire hériter le service Gwt de PersistentRemoteService plutot que de RemoteService. Hors je ne fais plus hériter moi-même mon service de RemoteService puisque j'utilise spring4Gwt... La je vois certains sites proposer des solutions avec gwt-sl au lieu de spring4gwt car gwt-sl permet une intégration avec gilead via une librairie nommée HB4GWTRPCServiceExporter.
Voila mon souci, je voudrais savoir si il est possible d'utiliser Gilead en conservant spring4gwt?
Est-ce qu'il y a une solution simple pour cela?
Est-ce qu'il me manque beaucoup de choses pour pouvoir enfin utiliser tous les objets de mon datamodel entre le client et le serveur ?
Partager