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 :

Problème d'appel d'une méthode (RPC Mode)


Sujet :

GWT et Vaadin Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 90
    Par défaut Problème d'appel d'une méthode (RPC Mode)
    Bonjour,

    J'ai mis en place une application GWT devant récupérer des données via un webservice afin de les afficher à l'écran. J'ai d'abord voulu implémenter cette méthode de manière simple avant de me rendre compte en me renseignant que je devais utiliser GWT RPC pour pouvoir utiliser ma méthode dans mon application (utilisation de librairie non utilisable côté client).

    J'ai donc suivi le tutoriel sur google code mais je n'arrive pas à faire marcher l'appel à ma méthode.

    Voici donc le contenu de mon fichier .gwt.xml:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?xml version="1.0" encoding="UTF-8"?>
    <module rename-to='intranet'>
     
      <inherits name='com.google.gwt.user.User'/>
     
      <inherits name='com.google.gwt.user.theme.clean.Clean'/>
     
      <entry-point class='com.societe.web.client.Intranet'/>
     
      <source path='client'/>
      <source path='shared'/>
     
    </module>
    Le contenu de ma classe côté serveur, ClientServiceImpl:

    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
    36
    37
    38
     
    @SuppressWarnings("serial")
    public class ClientServiceImpl extends RemoteServiceServlet implements ClientService {
     
    	public List<Client> getListeClients() {
    		String endpoint = "http://localhost:8095/Processes/ReferentielSocieteServices.serviceagent/ReferentielSocieteEndpoint";
    		ReferentielSocieteEndpointBindingStub stub;
    		GetListClientsResponseClientsClient[] clients = null;
    		try {
    			stub = new ReferentielSocieteEndpointBindingStub(new java.net.URL(endpoint), new Service());
    			GetListClientsRequest req = new GetListClientsRequest();
    			GetListClientsResponse resp = stub.getListClients(req);
    			clients = resp.getClients();
    		} catch (AxisFault e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (MalformedURLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (RemoteException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		List<Client> CLIENTS = Arrays.asList();
     
    		for (int i =0;i<clients.length;i++){
    			GetListClientsResponseClientsClient clientXML = clients[i];
    			Client client = new Client(clientXML.getCLIENT_NOM(),
    					clientXML.getCLIENT_PHONE(),
    					clientXML.getCLIENT_EMAIL(),
    					clientXML.getSECTEUR_NOM(),
    					clientXML.getCLIENT_ACTIF().toString());
    			CLIENTS.add(client);
    		}
     
    		return CLIENTS;
    	}
    }
    Le code de ma première interface côté client, ClientService:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    @RemoteServiceRelativePath("clients")
    public interface ClientService extends RemoteService {
     
    	public List<Client> getListeClients();
     
    }
    Le code de ma seconde interface côté client, ClientServiceAsync:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public interface ClientServiceAsync {
     
    	public void getListeClients(AsyncCallback<List<Client>> callback);
    }
    Ma classe Client (dont je récupère les données):

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    public class Client {
        private String name;
        private String phone;
        private String mail;
        private String actif;
        private String secteur;
        private ClientServiceAsync clientSvc = GWT.create(ClientService.class);
     
    	public Client(String name, String phone, String mail,String secteur, String actif) {
          this.name = name;
          this.phone = phone;
          this.mail = mail;
          this.secteur = secteur;
          this.actif = actif;
        }
     
    	public Client(){	
    	}
     
    	public String getName() {
    		return name;
    	}
     
    	public void setName(String name) {
    		this.name = name;
    	}
     
    	public String getPhone() {
    		return phone;
    	}
     
    	public void setPhone(String phone) {
    		this.phone = phone;
    	}
     
    	public String getMail() {
    		return mail;
    	}
     
    	public void setMail(String mail) {
    		this.mail = mail;
    	}
     
    	public String getActif() {
    		return actif;
    	}
     
    	public void setActif(String actif) {
    		this.actif = actif;
    	}
     
    	public String getSecteur() {
    		return secteur;
    	}
     
    	public void setSecteur(String secteur) {
    		this.secteur = secteur;
    	}
     
     
     
           public void getListeClientsCallback(final List<Client> list) {
     
    		 // Initialize the service proxy.
    	    if (clientSvc == null) {
    	    	clientSvc = GWT.create(ClientService.class);
    	    }
     
    	    // Set up the callback object.
    	    AsyncCallback<List<Client>> callback = new AsyncCallback<List<Client>>() {
    	      public void onFailure(Throwable caught) {
    	        // TODO: Do something with errors.
    	      }
     
    	      public void onSuccess(List<Client> result) {
    	    	  for (Client client : result) {
    	    	      list.add(client);
    	    	    }
    	      }
    	    };   
    	 // Make the call to the stock price service.
    	    clientSvc.getListeClients(callback);
    	}
     
    	public List<Client> getListeClients(List<Client> clientList){
    		return clientList;
    	}
    }
    Et l'appel à ma procédure dans ma classe d'entrypoint:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	    Client c = new Client();
    	    c.getListeClientsCallback(list);
    Hors, lorsque j'exécute le code en debug, je ne rentre jamais dans la méthode de la classe côté serveur (ClientServiceImpl) ni d'ailleurs dans le onSuccess de ma méthode callback.

    Qu'est ce que je fais de "mal"?

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 165
    Par défaut
    Comment appelles-tu la méthode "getListeClientsCallback"?

    Cette méthode ne devrait pas être dans ta classe Client. Ta classe Client est un DTO qui doit implémenter Serializable.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 90
    Par défaut
    Bonjour galel,

    Tout d'abord merci pour ton aide. Je viens de modifier la classe client suivant tes recommandations, et j'ai déplacé ma méthode callback dans la classe qui implémente entrypoint.

    Voici la nouvelle classe Client:

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    public class Client implements Serializable {
        private String name;
        private String phone;
        private String mail;
        private String actif;
        private String secteur;
     
     
    	public Client(String name, String phone, String mail,String secteur, String actif) {
          this.name = name;
          this.phone = phone;
          this.mail = mail;
          this.secteur = secteur;
          this.actif = actif;
        }
     
    	public Client(){	
    	}
     
    	public String getName() {
    		return name;
    	}
     
    	public void setName(String name) {
    		this.name = name;
    	}
     
    	public String getPhone() {
    		return phone;
    	}
     
    	public void setPhone(String phone) {
    		this.phone = phone;
    	}
     
    	public String getMail() {
    		return mail;
    	}
     
    	public void setMail(String mail) {
    		this.mail = mail;
    	}
     
    	public String getActif() {
    		return actif;
    	}
     
    	public void setActif(String actif) {
    		this.actif = actif;
    	}
     
    	public String getSecteur() {
    		return secteur;
    	}
     
    	public void setSecteur(String secteur) {
    		this.secteur = secteur;
    	}
     
     
    }
    Et voici ma classe implémentant entrypoint:

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    public class IntranetLayona implements EntryPoint {
     
    	private ClientServiceAsync clientSvc = GWT.create(ClientService.class);
    	/**
             * This is the entry point method.
             */
    	public void onModuleLoad() {
     
     
    		[...]
    		//remplissage de la table des clients
    		ListDataProvider<Client> clientProvider = new ListDataProvider<Client>();
    		clientProvider.addDataDisplay(clientCellTable);
     
    	    List<Client> list = clientProvider.getList();
     
    	    getListeClientsCallback(list);
     
    	    clientProvider.refresh();
     
    	[.....]
    	}
     
    	public void getListeClientsCallback(final List<Client> list) {
     
    		 // Initialize the service proxy.
    	    if (clientSvc == null) {
    	    	clientSvc = GWT.create(ClientService.class);
    	    }
     
    	    // Set up the callback object.
    	    AsyncCallback<List<Client>> callback = new AsyncCallback<List<Client>>() {
    	      public void onFailure(Throwable caught) {
    	        // TODO: Do something with errors.
    	      }
     
    	      public void onSuccess(List<Client> result) {
    	    	  for (Client client : result) {
    	    	      list.add(client);
    	    	    }
    	      }
    	    };   
    	 // Make the call to the stock price service.
    	    clientSvc.getListeClients(callback);
    	}
    }
    Je précise qu'auparavant j'effectuais le remplissage de mon objet clientProvider avec une méthode qui rajoutait une liste de clients en dur et que ca fonctionnait correctement.

    Là, je viens de relancer en debug et j'ai toujours le même probleme, je ne rentre pas dans le onSuccess (ni dans le onFailure d'ailleurs en éxecutant pas à pas) de ma méthode callback :/

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 165
    Par défaut
    Avant de vérifier si tu as une réponse pour ton CallBack vérifie que l'appel au serveur se fait correctement. Pour cela mets un break point sur ton ServiceImpl.

    Vérifies aussi si ta servlet est bien déclarée dans le web.xml

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 90
    Par défaut
    J'ai omis de préciser que j'ai aussi mis un point de débuggage dans mon ServiceImpl et que l'exécution du code ne passe jamais dans cette classe.

    Concernant le web.xml, j'ai bien mis la déclaration de ma servlet comme suit:

    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
     
     
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE web-app
        PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd">
     
    <web-app>
     
      <!-- Servlets -->
      <servlet>
        <servlet-name>clientServiceImpl</servlet-name>
        <servlet-class>com.societe.web.server.ClientServiceImpl</servlet-class>
      </servlet>
     
      <servlet-mapping>
        <servlet-name>clientServiceImpl</servlet-name>
        <url-pattern>/intranet/clientService</url-pattern>
      </servlet-mapping>
     
      <!-- Default page to serve -->
      <welcome-file-list>
        <welcome-file>IntranetSociete.html</welcome-file>
      </welcome-file-list>
     
    </web-app>

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 165
    Par défaut
    dans l'interface ClientService
    @RemoteServiceRelativePath("clients")
    dans le web.xml
    clientServiceImpl
    Les deux noms doivent être identiques.

Discussions similaires

  1. problème lors de l'appel d'une méthode
    Par khadi8 dans le forum Débuter
    Réponses: 6
    Dernier message: 09/04/2013, 07h57
  2. Problème de timeout lors de l'appel d'une méthode Stop
    Par drieu13 dans le forum API standards et tierces
    Réponses: 0
    Dernier message: 12/04/2012, 16h53
  3. problème d'appel d'une méthode d'un service web
    Par aida1986 dans le forum Services Web
    Réponses: 15
    Dernier message: 21/05/2010, 15h10
  4. problème lors de l'appel d'une méthode
    Par sfaxian dans le forum VB.NET
    Réponses: 9
    Dernier message: 10/07/2009, 14h39
  5. Réponses: 6
    Dernier message: 24/03/2009, 16h17

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