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 :

RPC "did you forget to inherit a required module?"


Sujet :

GWT et Vaadin Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de gwinyam
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 162
    Par défaut RPC "did you forget to inherit a required module?"
    Salut à tous!

    J'ai commencé à coder un petit projet GWT, mais j'ai un bug que je ne comprends pas quand je compile, il me dit ça:
    Compiling module com.gwt.test.TestGWT
    Validating newly compiled units
    [ERROR] Errors in 'file:/D:/EclipseWorkspace/testGWT/src/com/gwt/test/client/ArticleServiceAsync.java'
    [ERROR] Line 13: No source code is available for type org.cmn.metier.Article; did you forget to inherit a required module?
    [ERROR] Errors in 'file:/D:/EclipseWorkspace/testGWT/src/com/gwt/test/client/ArticleService.java'
    [ERROR] Line 14: No source code is available for type org.cmn.metier.Article; did you forget to inherit a required module?
    Finding entry point classes
    [ERROR] Unable to find type 'com.gwt.test.client.TestGWT'
    [ERROR] Hint: Previous compiler errors may have made this type unavailable
    [ERROR] Hint: Check the inheritance chain from your module; it may not be inheriting a required module or a module may not be adding its source path entries properly
    J'ai vu qu'il pouvait y avoir un problème dans le fichier .gwt.xml qui pourrait expliquer cela mais je ne comprends pas comment faire pour corriger.

    Voilà mon code:
    TestGWT.gwt.xml
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?xml version="1.0" encoding="UTF-8"?>
    <module rename-to='testgwt'>
      <inherits name='com.google.gwt.user.User'/>
      <inherits name='com.google.gwt.user.theme.standard.Standard'/>
      <entry-point class='com.gwt.test.client.TestGWT'/>
      <source path='client'/>
      <source path='shared'/>
    </module>
    ArticleService.java
    Code java : 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.gwt.test.client;
     
    import com.google.gwt.user.client.rpc.RemoteService;
    import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;
    import java.util.List;
     
    import org.cmn.metier.Article;
     
    /**
     * The client side stub for the RPC service.
     */
    @RemoteServiceRelativePath("article")
    public interface ArticleService extends RemoteService {
    	List<Article> articleServer() throws IllegalArgumentException;
    }
    ArticleServiceSync.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    package com.gwt.test.client;
     
    import java.util.List;
     
    import org.cmn.metier.Article;
     
    import com.google.gwt.user.client.rpc.AsyncCallback;
     
    /**
     * The async counterpart of <code>GreetingService</code>.
     */
    public interface ArticleServiceAsync {
    	void articleServer(AsyncCallback<List<Article>> callback);
    }
    ArticleServiceImpl.java
    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
    package com.gwt.test.server;
     
    import java.util.List;
     
    import net.sf.hibernate.*;
     
    import org.cmn.metier.Article;
    import org.cmn.hibernate.HibernateUtil;
     
    import com.gwt.test.client.ArticleService;
    import com.google.gwt.user.server.rpc.RemoteServiceServlet;
     
    /**
     * The server side implementation of the RPC service.
     */
    @SuppressWarnings("serial")
    public class ArticleServiceImpl extends RemoteServiceServlet implements
    		ArticleService {
    	@SuppressWarnings("unchecked")
    	@Override
    	public List<Article> articleServer() throws IllegalArgumentException {
    		List<Article> list = null;
    		try {
    			Session session = HibernateUtil.currentSession();
    			list = (List<Article>)session.find("from Article");
    			HibernateUtil.closeSession();
    		}
    		catch (Exception e) {
    		}
    		return list;
    	}
    }
    Je n'ai aucun warning ni erreur renvoyés par Eclipse et pourtant il m'envoie péter à la compilation avec l'erreur citée ci-dessus. Je comprends pas...

    Vous avez une idée de ce qu'il se passe?
    Merci d'avance!

    Gwinyam

  2. #2
    Membre éclairé

    Inscrit en
    Août 2002
    Messages
    302
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Août 2002
    Messages : 302
    Par défaut
    Bonjour,
    Le problème vient du fait que votre classe Article n'est pas dans votre package client, les méthodes RPC sont censées échanger des objets déclarés coté client.
    Pour cela, déclare un objet ArticleInfo par exemple dans ton package client, ta méthode RPC renverra ArticleInfo à la place d'Article.

  3. #3
    Membre émérite
    Avatar de gwinyam
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 162
    Par défaut
    Bonjour,

    J'ai rajouté une classe "ArticleInfo" dans le package "client" comme vous l'avez suggéré mais voilà qu'il me sort une erreur de compilation quasi-similaire:
    Compiling module com.gwt.test.TestGWT
    Validating newly compiled units
    [ERROR] Errors in 'file:/D:/EclipseWorkspace/testGWT/src/com/gwt/test/client/ArticleInfo.java'
    [ERROR] Line 5: No source code is available for type org.cmn.metier.Article; did you forget to inherit a required module?
    Finding entry point classes
    [ERROR] Unable to find type 'com.gwt.test.client.TestGWT'
    [ERROR] Hint: Previous compiler errors may have made this type unavailable
    [ERROR] Hint: Check the inheritance chain from your module; it may not be inheriting a required module or a module may not be adding its source path entries properly
    Voilà le code de ArticleInfo.java:
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    package com.gwt.test.client;
     
    import org.cmn.metier.Article;
     
    public class ArticleInfo extends Article {
    	private static final long serialVersionUID = 1L;
     
    }
    Dans les autres classes de mon précédent message, j'ai remplacé tous les "Article" par "ArticleInfo" et modifié correctement les import en conséquence.

    Comprends pas
    Merci du coup de main, mais visiblement, c'est pas encore ça

  4. #4
    Membre éclairé

    Inscrit en
    Août 2002
    Messages
    302
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Août 2002
    Messages : 302
    Par défaut

    Non c'est pas ce que j'ai dit exactement,
    Il faut que ton package client ne référence à aucun moment la classe Article (et tout autre classe métier non définie dans ton package client),l'idée c'est de faire une copie de ta classe Article que tu nommera ArticleInfo. Dans le corps de ta méthode tu copie le contenu de l'objet Artcile dans l'objet ArticleInfo instancié.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    //Corps de ta méthode asynchrone
    ArticleInfo articleInfo = new ArticleInfo();
    articleInfo.setId(article.getId()); // par exemple
    return articleInfo;
    et la signature de ta méthode serait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    public interface ArticleService extends RemoteService {
    	List<ArticleInfo> articleServer() throws IllegalArgumentException;
    ta classe ArticleInfo doit implémenter l'interface Serializable.
    J'espère que c'est plus clair

  5. #5
    Membre émérite
    Avatar de gwinyam
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 162
    Par défaut
    Bon ok, j'avais pas compris ça en effet.

    Et là bah ça marche, c'est cool^^

    Je voudrais pas abuser mais du coup, j'ai une nouvelle erreur qui me dit d'aller me faire cuire. Et j'ai pas trop envie

    Dans ma classe d'utilisation (celle proposée par défaut pour la démo de GWT), j'ai rajouté ce code là tout en haut là où ils définissent le proxy Greetings de démo:
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    	/**
             * Create a remote service proxy to talk to the server-side Article service.
             */
    	private final ArticleServiceAsync articleService = GWT
    			.create(ArticleService.class);
    et aussi ce code là dans la méthode onModuleLoad() :
    Code java : 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
    		// recupérer les articles
    		List<ArticleInfo> liste = articleService.articleServer(new AsyncCallback<List<ArticleInfo>>() {
    			public void onFailure(Throwable caught) {
    				// Show the RPC error message to the user
    				dialogBox
    						.setText("Remote Procedure Call - Failure");
    				serverResponseLabel
    						.addStyleName("serverResponseLabelError");
    				serverResponseLabel.setHTML(SERVER_ERROR);
    				dialogBox.center();
    				closeButton.setFocus(true);
    			}
     
    			public void onSuccess(String result) {
    				dialogBox.setText("Remote Procedure Call");
    				serverResponseLabel
    						.removeStyleName("serverResponseLabelError");
    				serverResponseLabel.setHTML(result);
    				dialogBox.center();
    				closeButton.setFocus(true);
    			}});
    J'ai le droit à une magnifique erreur:
    Type mismatch: cannot convert from void to List<ArticleInfo> TestGWT.java
    ça démarre sur la ligne citée plus haut:
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    List<ArticleInfo> liste = articleService.articleServer(new AsyncCallback<List<ArticleInfo>>() {

    ça va me rendre chèvre ce truc

    merci d'avance

  6. #6
    Membre éclairé

    Inscrit en
    Août 2002
    Messages
    302
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Août 2002
    Messages : 302
    Par défaut
    Bah ce qu'il faudrait regarder c la signature de ta méthode Asynch qui devrait etre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public void articleServer (AsyncCallback<List< ArticleInfo>> callback);
    Et je vois un truc qui me semble étrange,ta méthode onSuccess prend en paramètre un String alors qu'elle doit prendre List< ArticleInfo>.
    Quel est l'outil que t'utilises pour génerer tes Async et l'implémentation automatique de tes interfaces ? Sous eclipse tu devrais pas avoir ce genre de problème et il t'aurait aidé à trouver la solution à l'erreur précédente.

  7. #7
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 3
    Par défaut Corps de ta methode Async
    Citation Envoyé par nannous Voir le message

    Non c'est pas ce que j'ai dit exactement,
    Il faut que ton package client ne référence à aucun moment la classe Article (et tout autre classe métier non définie dans ton package client),l'idée c'est de faire une copie de ta classe Article que tu nommera ArticleInfo. Dans le corps de ta méthode tu copie le contenu de l'objet Artcile dans l'objet ArticleInfo instancié.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    //Corps de ta méthode asynchrone
    ArticleInfo articleInfo = new ArticleInfo();
    articleInfo.setId(article.getId()); // par exemple
    return articleInfo;
    et la signature de ta méthode serait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    public interface ArticleService extends RemoteService {
    	List<ArticleInfo> articleServer() throws IllegalArgumentException;
    ta classe ArticleInfo doit implémenter l'interface Serializable.
    J'espère que c'est plus clair

    Salut,

    je ne comprends pas et je n'arrive pas à faire la même chose. Comment on peut rajouter du code dans le corps de la methode Async alors cette dernière ne doit pas contenir de code justement. On y met juste le prototype de la methode avec un argument Callback en plus car on se trouve dans une Interface.

    Tu lui dis d'instancier articleInfo (qui extends Article),et après tu fais un return articleInfo. Moi j'ai essayer de le faire mais ce n'est pas possible dans la méthode Async. Le seul truc qu'on peut faire à la limite c'est d'instancier ArticleInfo juste avant la declaration de la methode Async (un peu comme une variable de classe) mais pas de faire des return qui pourraient être recuperer par la methode Impl.

    J'ai essayer de faire la copie que tu suggère dans la classe Impl mais ça reviens au même puisqu'il fera référence à une classe externe lors de la copie.

    J'ai le même problème que le collègue qui lui à compris ta solution. moi j'ai un peu de mal. Donc j'aimerais avoir svp une réponse de l'un d'entre vous avec un peu plus de détail.

    Merci

  8. #8
    Membre émérite
    Avatar de gwinyam
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 162
    Par défaut
    Fais voir le code, qu'on te montre là où ça déconne, ça sera plus simple

  9. #9
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 3
    Par défaut
    Citation Envoyé par nannous Voir le message


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    //Corps de ta méthode asynchrone
    ArticleInfo articleInfo = new ArticleInfo();
    articleInfo.setId(article.getId()); // par exemple
    return articleInfo;
    et la signature de ta méthode serait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    public interface ArticleService extends RemoteService {
    	List<ArticleInfo> articleServer() throws IllegalArgumentException;
    ta classe ArticleInfo doit implémenter l'interface Serializable.
    J'espère que c'est plus clair
    En effet tu as raison mon problème est similaire à celui que tu as eu...
    Alors je ne sais pas si tu t'en souviens encore mais quand l'autre collègue disait "Le corps de ta méthode asynchrone" il parlait de quelle méthode exactement?

    Et aussi est-ce qu'au final tu as gardé et utilisé telle quelle ta classe ArticleInfo qui extends Article?

    Avec quelques infos supplémentaires je pourrai certainement suivre ton modèle.

    Merci

  10. #10
    Membre chevronné
    Profil pro
    Lead Tech Agile
    Inscrit en
    Septembre 2004
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Lead Tech Agile

    Informations forums :
    Inscription : Septembre 2004
    Messages : 316
    Par défaut
    Salut pefoungowo,

    tu devrais nous montrer tes logs d'erreurs afin qu'on puisse mieux t'orienter vers une solution adequate.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. invalid use of member (did you forget '&' ?)
    Par Go'Gaule dans le forum Débuter
    Réponses: 2
    Dernier message: 13/09/2011, 15h28
  2. Did you forget to inherit module
    Par Jacky31 dans le forum GWT et Vaadin
    Réponses: 14
    Dernier message: 02/08/2010, 15h47
  3. [SmartGWT] did you forget to inherit a required module?
    Par touille dans le forum GWT et Vaadin
    Réponses: 3
    Dernier message: 05/05/2010, 10h46
  4. problème avec GWT:did you forget to inherit a required module
    Par riadhhwajdii dans le forum GWT et Vaadin
    Réponses: 10
    Dernier message: 03/02/2010, 15h42
  5. [Free Pascal] [2.2.4] Message "link.res contains output sections; did you forget -T?"
    Par whatelse dans le forum Free Pascal
    Réponses: 4
    Dernier message: 16/11/2009, 20h56

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