IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GWT et Vaadin Java Discussion :

Serialization, RPC & ServerSide Objects


Sujet :

GWT et Vaadin Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Juin 2006
    Messages : 46
    Par défaut Serialization, RPC & ServerSide Objects
    Bonjour.

    Je rencontre un petit soucis concernant les mécanismes de serialization avec GWT.

    Donc dans mon package client j'ai
    - DataBindingExemple : ma classe entrypoint
    - IPersonne : une interface qui doit me servir à récupérer un objet se trouvant sur le serveur.
    - RemotePersonne et RemotePersonneAsync pour le service.

    Dans mon package serveur :
    - Personne : ma classe personne
    - RemotePersonneImpl : l'implémentation de mon service.


    Dans mon projet, je souhaite réutiliser mes classes métier (ici Personne) se trouvant sur le serveur dans mon interface coté client. Et pour ce projet, ces classes métier sont générées dynamiquement au démarrage de l'application puis chargées. Elles ne peuvent donc pas être connues de mon coté client lors de la compilation de GWT, mais je connais la structure de mes classes. C'est pour cela que je compte les utiliser au travers d'une interface.

    Les codes coté serveur :

    Personne.class
    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
    33
    package com.zenika.tutorial.gwt.server;
     
    import com.zenika.tutorial.gwt.client.IPersonne;
     
    public class Personne implements IPersonne{
     
    	private String nom;
    	private String prenom;
     
    	public Personne() {
    	}
     
    	public Personne(String prenom, String nom) {
    		this.prenom = prenom;
    		this.nom = nom;
    	}
     
    	public String getNom() {
    		return nom;
    	}
     
    	public void setNom(String nom) {
    		this.nom = nom;
    	}
     
    	public String getPrenom() {
    		return prenom;
    	}
     
    	public void setPrenom(String prenom) {
    		this.prenom = prenom;
    	}
    }
    RemotePersonneImpl :
    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
    package com.zenika.tutorial.gwt.server;
     
    import com.zenika.tutorial.gwt.client.IPersonne;
    import com.zenika.tutorial.gwt.client.RemotePersonne;
    import com.google.gwt.user.server.rpc.RemoteServiceServlet;
     
    public class RemotePersonneImpl extends RemoteServiceServlet implements RemotePersonne {
    	public IPersonne getPersonnes(){
     
    		IPersonne p1 = (IPersonne) new Personne();
    		p1.setNom("Nom");
    		p1.setPrenom("Prenom");
    		return p1;
    	}
    }
    Coté client :
    Mon interface IPersonne
    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
    package com.zenika.tutorial.gwt.client;
     
    import com.google.gwt.user.client.rpc.IsSerializable;
     
    public interface IPersonne extends IsSerializable{
     
    	public String getNom();
     
    	public void setNom(String nom) ;
     
    	public String getPrenom();
     
    	public void setPrenom(String prenom) ;
     
    }
    et ma classe DataBindingExample
    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
    33
    34
    35
    package com.zenika.tutorial.gwt.client;
     
    import com.extjs.gxt.ui.client.widget.MessageBox;
    import com.google.gwt.core.client.EntryPoint;
    import com.google.gwt.core.client.GWT;
    import com.google.gwt.user.client.Window;
    import com.google.gwt.user.client.rpc.AsyncCallback;
    import com.google.gwt.user.client.rpc.ServiceDefTarget;
     
    public class DataBindingExemple implements EntryPoint {
     
    	public void onModuleLoad() {
     
    		final RemotePersonneAsync ihmService = ( RemotePersonneAsync )GWT.create( RemotePersonne.class );
     
    		ServiceDefTarget endpoint = ( ServiceDefTarget )ihmService;
    		String moduleRelativeURL = GWT.getModuleBaseURL()+"/personne";
    		endpoint.setServiceEntryPoint( moduleRelativeURL );
     
    		final AsyncCallback callback = new AsyncCallback()
    		{
    			public void onSuccess( Object result ) {
    				// take the result coming from the server
    				IPersonne personne =  (IPersonne) result;				
    				Window.alert(personne.getNom());
     
    			}
    			public void onFailure( Throwable caught ) {
    				MessageBox.prompt( "Error", "Error while logging in" + caught.getMessage() );
    			}
    		};
     
    		ihmService.getPersonnes(callback);
    		}
    }
    Au moment de la compilation du client en mode hosted j'ai cette erreur :
    [DEBUG] Rebinding com.zenika.tutorial.gwt.client.RemotePersonne
    [DEBUG] Invoking <generate-with class='com.google.gwt.user.rebind.rpc.ServiceInterfaceProxyGenerator'/>
    [DEBUG] Generating client proxy for remote service interface 'com.zenika.tutorial.gwt.client.RemotePersonne'
    [DEBUG] Analyzing 'com.zenika.tutorial.gwt.client.RemotePersonne' for serializable types
    [DEBUG] Analyzing methods:
    [DEBUG] public abstract com.zenika.tutorial.gwt.client.IPersonne getPersonnes()
    [DEBUG] Return type: com.zenika.tutorial.gwt.client.IPersonne
    [DEBUG] com.zenika.tutorial.gwt.client.IPersonne
    [ERROR] Type 'com.zenika.tutorial.gwt.client.IPersonne' was not serializable and has no concrete serializable subtypes

    Avez vous une idée du problème?

  2. #2
    Membre confirmé

    Inscrit en
    Juin 2003
    Messages
    229
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Juin 2003
    Messages : 229
    Par défaut
    Je pense que lorsque le service cherche à sérialiser p1 de type déclaré "IPersonne", il utilise la classe concrète de p1 (donc Personne, puisque le constructeur est Personne(String, String)) pour la serialisation (Je ne vois pas comment il pourrait faire autrement).

    Ce qui est étonnant, c'est que la classe Personne devrait être serialisable (Constructeur sans paramètres, et accesseur pour chaque donnée membre), mais il ne la reconnait pas en tant que telle.

    Essaye quelquechose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    package com.zenika.tutorial.gwt.server;
     
    import com.zenika.tutorial.gwt.client.IPersonne;
    import com.google.gwt.user.client.rpc.IsSerializable;
     
    public class Personne extends IsSerializable implements IPersonne {
     
    	private String nom;
    	private String prenom;
    ...

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Juin 2006
    Messages : 46
    Par défaut
    Merci pour ta réponse.

    IsSerializable est une interface donc Personne ne peux que l'implémenter.

    J'ai essayé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public class Personne implements IPersonne, IsSerializable{
     
    	private String nom;
    	private String prenom;
    C'est la même erreur.

    Autre chose, lorsque je met ma classe Personne dans le package client, ca fonctionne sans problème... Faut-il que l'implémentation de mon interface soit compilée en javascript avec le client?

    Je viens de trouver quelqu'un qui a le même problème que moi :
    DTO with interface in client and its implementation in server


    Isaac Truett

    Your DTO implementation is in the server package. However, it needs to
    be compiled into JS to work on the client.
    You can move the impl to
    the client package or move the impl and interface to a neutral package
    location ("common" or "model" are popular choices, I believe) and
    adjust your module definition appropriately.
    Donc ça me semble impossible dans le cas de mon projet, car mes classes sont générées dynamiquement au démarrage de mon appli... Dommage, je crois que je vais revenir à ExtJs pour mon IHM.

  4. #4
    Membre confirmé

    Inscrit en
    Juin 2003
    Messages
    229
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Juin 2003
    Messages : 229
    Par défaut
    La solution que je te proposais n'aurait pas eu beaucoup de sens, en effet ; cependant il faut bien garder à l'esprit que ce n'est pas la JVM qui exécute le code écrit côté client, mais le moteur javascript du navigateur avec une version compilée par GWT du code java. Donc ce genre de subtilité n'est pas toujours à exclure, car le compilateur n'est pas une copie de la JVM.

    Pour ton problème, je n'avais pas vu que Personne n'était pas déclaré dans le package client. J'avais également essayé, il y a quelques temps, d'importer des objets d'autres packages que "client", mais je n'y étais pas parvenu.

Discussions similaires

  1. serialization object update
    Par Mattgic dans le forum C#
    Réponses: 2
    Dernier message: 19/11/2010, 12h16
  2. Réponses: 0
    Dernier message: 27/09/2009, 23h44
  3. Erreur quand je retourne Object[][] suite à un RPC
    Par Wiliam_Walas dans le forum GWT et Vaadin
    Réponses: 4
    Dernier message: 08/05/2008, 08h27
  4. serializer different object dans un ficher xml
    Par ZashOne dans le forum Framework .NET
    Réponses: 2
    Dernier message: 04/05/2008, 17h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo