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
  1. 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>
  2. 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
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>
Pour exposer ces beans à mes services, j'ai
  1. Transformer mon service

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 service n'hérite plus de RemoteService.

Le fichier spring-web-config.xml
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"/>
Permet de renseigner les classes qui seront utilisées comme service, en l'occurence le package server.

web.xml
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>
Ici on trouve un mapping et on voit que pour les appels de services la servlet de spring4gwt prendra la main.

Un exemple de code de ma classe MyServiceImpl
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
@Transactional(readOnly = false)
    public List<FoodType> getAllFoodType() {
        return foodTypeDao.getAll();
    }
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.

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 :
  1. Les DTO (data transfert object)
  2. 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

  1. Je télécharge gilead-1.3.0.1169.zip
  2. 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
  3. 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 ?
  4. ajouter un héritage dans le module.gwt.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <inherits name='net.sf.gilead.Adapter4Gwt15'/>
    Ce code la ne fonctionne pas chez moi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <inherits name='net.sf.gilead.Gilead4Gwt'/>
    Celui-ci fonctionne, faut-il un des 2, les 2 ? sont-ils tout à fait différents ?
  5. 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 ?