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

  1. #1
    Membre chevronné
    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 : 37
    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
    Points : 2 015
    Points
    2 015
    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
    Comparez la qualité et le prix du matériel de bricolage ou de maison avant d'acheter : MatosMaison
    Le bouton ne masse pas les pieds, mais ça aide la communauté.

  2. #2
    Membre actif

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

    Informations forums :
    Inscription : Août 2002
    Messages : 302
    Points : 285
    Points
    285
    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 chevronné
    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 : 37
    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
    Points : 2 015
    Points
    2 015
    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
    Comparez la qualité et le prix du matériel de bricolage ou de maison avant d'acheter : MatosMaison
    Le bouton ne masse pas les pieds, mais ça aide la communauté.

  4. #4
    Membre actif

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

    Informations forums :
    Inscription : Août 2002
    Messages : 302
    Points : 285
    Points
    285
    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 chevronné
    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 : 37
    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
    Points : 2 015
    Points
    2 015
    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
    Comparez la qualité et le prix du matériel de bricolage ou de maison avant d'acheter : MatosMaison
    Le bouton ne masse pas les pieds, mais ça aide la communauté.

  6. #6
    Membre actif

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

    Informations forums :
    Inscription : Août 2002
    Messages : 302
    Points : 285
    Points
    285
    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
    Membre chevronné
    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 : 37
    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
    Points : 2 015
    Points
    2 015
    Par défaut
    Et Eclipse l'a fait, c'est moi qui suis juste un peu abruti. Je viens de me rappeler le concept de Callback et là du coup bah ça marche et j'ai plus d'erreur.

    Bon bah merci hein^^
    Comparez la qualité et le prix du matériel de bricolage ou de maison avant d'acheter : MatosMaison
    Le bouton ne masse pas les pieds, mais ça aide la communauté.

  8. #8
    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
    Points : 4
    Points
    4
    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

  9. #9
    Membre chevronné
    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 : 37
    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
    Points : 2 015
    Points
    2 015
    Par défaut
    Fais voir le code, qu'on te montre là où ça déconne, ça sera plus simple
    Comparez la qualité et le prix du matériel de bricolage ou de maison avant d'acheter : MatosMaison
    Le bouton ne masse pas les pieds, mais ça aide la communauté.

  10. #10
    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
    Points : 4
    Points
    4
    Par défaut RPC "did you forget to inherit a required
    ok c un projet maven dans lequel la partie GWT à une dependance avec la partie Jpa.

    classe Member à partir de laquelle la table du même nom est générée en base grâce à eclipse link.
    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
    package com.ViArts.ViArtsJpa.entities;
     
    import java.util.*;
     
    import javax.persistence.*;
     
     
    @Entity
    @Table
    public class Members implements java.io.Serializable {
     
    	/**
             * 
             */
    	private static final long serialVersionUID = 1L;
    	@Id
    	@Column(name = "mail", unique = true, nullable = false, length = 45)
    	private String mail;
    	@Column(name = "nom", nullable = false, length = 45)
    	private String nom;
    	@Column(name = "prenom", nullable = false, length = 45)
    	private String prenom;
    	@Temporal(TemporalType.DATE)
    	@Column(name = "date_naiss", nullable = false, length = 10)
    	private Date dateNaiss;
    	@Column(name = "ville", nullable = false, length = 45)
    	private String ville;
    	@Column(name = "pays", nullable = false, length = 45)
    	private String pays;
    	@Column(name = "mdpass", nullable = false, length = 45)
    	private String mdpass;
    	@Column(name = "genre", nullable = false, length = 45)
    	private String genre;
    	@Column(name = "art", nullable = false, length = 45)
    	private String art;
    	@Column(name = "type_member", nullable = false, length = 45)
    	private String type_member;......les getter et les setter
    Classe gestionMember dans laquelle on retrouve la fonction d'ajout de membre.

    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
    package com.ViArts.ViArtsJpa.sessions;
     
    import java.util.Date;
     
     
    import javax.ejb.Stateless;
    import javax.ejb.TransactionManagement;
    import javax.ejb.TransactionManagementType;
    import javax.persistence.*;
     
    import com.ViArts.ViArtsJpa.entities.*;
     
    /**
     * Session Bean implementation class GestionMembers
     */
    @Stateless(mappedName = "gestionMembers")
    @TransactionManagement(TransactionManagementType.BEAN)
    public class GestionMembers{
     
        /**
         * Default constructor. 
         */
        public GestionMembers() {
        }
     
       public Members addMember(String mail,String nom,String prenom,Date dateNaiss, String ville, String pays,String mdpass, String genre, String art, String type_member){
    	   EntityManagerFactory emf = Persistence.createEntityManagerFactory("ViArtsJpa");
    	   EntityManager em = emf.createEntityManager();
    	   em.getTransaction().begin();
    	   Members m = new Members();
    	   m.setMail(mail);
    	   m.setNom(nom);
    	   m.setPrenom(prenom);
    	   m.setDateNaiss(dateNaiss);
    	   m.setVille(ville);
    	   m.setPays(pays);
    	   m.setMdpass(mdpass);
    	   m.setGenre(genre);
    	   m.setArt(art);
    	   m.setType_member(type_member);
    	   em.persist(m);
    	   em.getTransaction().commit();
    	   em.close();
    	   emf.close();
           return m;
        }
    }
    Partie GWT:

    RPC:

    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
    package com.ViArts.ViArtsWeb.client;
     
    import java.util.Date;
     
    import com.ViArts.ViArtsJpa.sessions.GestionMembers;
    import com.google.gwt.user.client.rpc.RemoteService;
    import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;
     
    //The RemoteServiceRelativePath annotation automatically calls setServiceEntryPoint
    @RemoteServiceRelativePath("viartsService")
    public interface ViArtsService extends RemoteService {
     
    	public void addnewMember(String mail, String nom, String prenom,
    			Date dateNaiss, String ville, String pays, String mdpass,
    			String genre, String art, String type_member, GestionMembers gestion);
    }
    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.ViArts.ViArtsWeb.client;
     
    import java.util.Date;
     
    import com.ViArts.ViArtsJpa.sessions.GestionMembers;
    import com.google.gwt.user.client.rpc.AsyncCallback;
     
    public interface ViArtsServiceAsync {
     
    	public void addnewMember(String mail, String nom, String prenom,
    			Date dateNaiss, String ville, String pays, String mdpass,
    			String genre, String art, String type_member, GestionMembers gestion,
    			AsyncCallback<Void> callback);
    }
    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
    package com.ViArts.ViArtsWeb.server;
     
    import java.util.Date;
     
    import com.google.gwt.user.server.rpc.RemoteServiceServlet;
    import com.ViArts.ViArtsJpa.entities.Members;
    import com.ViArts.ViArtsJpa.sessions.GestionMembers;
    import com.ViArts.ViArtsWeb.client.ViArtsService;
     
    public class ViArtsServiceImpl extends RemoteServiceServlet implements
    		ViArtsService {
    	public void addnewMember(String mail, String nom, String prenom,
    			Date dateNaiss, String ville, String pays, String mdpass,
    			String genre, String art, String type_member, GestionMembers gestion) {
     
    		Members m = gestion.addMember(mail, nom,
    				prenom, dateNaiss, ville, pays,
    				mdpass, genre, art, type_member);
    	}
     
    }
    On module load dans laquelle on fait les appel rpc:

    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
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    package com.ViArts.ViArtsWeb.client;
     
    import java.util.Date;
     
    import com.ViArts.ViArtsJpa.sessions.GestionMembers;
    import com.google.gwt.core.client.EntryPoint;
    import com.google.gwt.core.client.GWT;
    import com.google.gwt.event.dom.client.ClickEvent;
    import com.google.gwt.event.dom.client.ClickHandler;
    import com.google.gwt.user.client.rpc.AsyncCallback;
    import com.google.gwt.user.client.ui.Button;
    import com.google.gwt.user.client.ui.Label;
    import com.google.gwt.user.client.ui.RootPanel;
     
    /**
     * Entry point classes define <code>onModuleLoad()</code>.
     */
    public class Application implements EntryPoint {
    	final GestionMembers gestion = new GestionMembers();
    	final ViArtsServiceAsync ViArtsService = (ViArtsServiceAsync) GWT
    			.create(ViArtsService.class);
    	final Button viArtsButton = new Button("Click ViArts");
    	final Button viArtsButton1 = new Button("Click Again");
    	final Button viArtsButton2 = new Button("Again Again");
    	final Label label = new Label(	"Add a new member");
    	final Label label1 = new Label("Add an other new member");
    	final Label label2 = new Label("Add an other new member Again");
     
    	/**
             * This is the entry point method.
             */
    	public void onModuleLoad() {
    		/****************************************************************************
                     * the instantiated service proxy to avoid creating it for subsequent calls.*
                     ****************************************************************************/
     
    		  /**
                       * (1) Create the client proxy. Note that although you are creating the
                       * service interface proper, you cast the result to the asynchronous
                       * version of the interface. The cast is always safe because the 
                       * generated proxy implements the asynchronous interface automatically.
                       */
    		final ViArtsServiceAsync ViArtsService = (ViArtsServiceAsync) GWT
    				.create(ViArtsService.class);
     
    		/**
                     * (2) Create an asynchronous callback to handle the result. 
                     */
    		final AsyncCallback callback = new AsyncCallback() {
    			public void onFailure(Throwable caught) {
    				System.out.println("Operation failed :(");
    			}
     
    			@Override
    			public void onSuccess(Object result) {
    				// TODO Auto-generated method stub
    				System.out.println("Operation succed :)");
    			}
    		};
    		/******************************************************
                     *                              Instantiation finish                              *
                     ******************************************************/
     
    		/**
                     * (3) Make the call. Control flow will continue immediately and later
                     * 'callback' will be invoked when the RPC completes.
                     * click the button to add a new member.
                     */
    		viArtsButton.addClickHandler(new ClickHandler() {
     
    			@Override
    			public void onClick(ClickEvent event) {
    				ViArtsService.addnewMember("robert@viart.com", "coulibaly", "robert",
    						new Date(1985 / 04 / 28), "Melun", "France", "rcoulibaly",
    						"homme", "peinture", "Superadmin",gestion, callback);
    			}
    		});
     
    		viArtsButton1.addClickHandler(new ClickHandler() {
     
    			@Override
    			public void onClick(ClickEvent event) {
    				ViArtsService.addnewMember("daouda@viart.com", "doucoure", "daouda",
    						new Date(1985 / 04 / 28), "Villeneuve St Georges", "France", "ddaouda",
    						"homme", "sculpture", "Superadmin",gestion, callback);
    			}
    		});
     
    		viArtsButton2.addClickHandler(new ClickHandler() {
     
    			@Override
    			public void onClick(ClickEvent event) {
    				ViArtsService.addnewMember("binh@viart.com", "dang", "binh",
    						new Date(1985 / 04 / 28), "Paris", "France", "bdang",
    						"homme", "design", "Superadmin",gestion, callback);
    			}
    		});
     
    		RootPanel.get().add(label);
    		RootPanel.get().add(viArtsButton);
    		RootPanel.get().add(label1);
    		RootPanel.get().add(viArtsButton1);
    		RootPanel.get().add(label2);
    		RootPanel.get().add(viArtsButton2);
    	}
    }
    ça a marché une foi g réussit à deployer un ear et la table était bien créée et chacun des trois boutton ajoutait bien un member dans la table lors d'un clic.

    Après je ne sais pas pourquoi ça arrêter de marcher:

    J'ai deux type d'erreur qui s'alternent au gré de mes tentations pour résoudre le pb:
    1 - .....did you forget to inherite the requier module
    2 - .....[ERROR] Hint: Check the inheritance chain from your module

    Merci

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

    Informations professionnelles :
    Activité : Lead Tech Agile

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

    Normalement ce type d'erreur apparait au niveau de la compilation Javascript.

    Au moment où GWT compile ton code en Javascript, certains fichiers Java sont absents du classPath.

    Dans ton cas c'est le fichier suivant qui manque :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [ERROR] Line 13: No source code is available for type org.cmn.metier.Article; did you forget to inherit a required module?
    org.cmn.metier.Article.java doit être dans le classpath au moment où le compilo GWT transforme le Java en javascript.

  12. #12
    Membre chevronné
    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 : 37
    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
    Points : 2 015
    Points
    2 015
    Par défaut
    Merci mais c'est bon, moi j'ai déjà eu ma réponse, ça a marché et on a même déjà bouclé et livré le projet (à temps en plus)

    Par contre pefoungowo, lui a un problème et grâce à la fonction rechercher, il a trouvé mon post et n'a pas souhaité en créer un nouveau mais continuer le mien vu que visiblement, le problème est assez similaire en tout cas dans la sortie.
    Ceci dit, là comme ça je t'avoue, pefoungowo, que je ne peux pas t'aider, pas encore assez bon en GWT je suis visiblement...
    Comparez la qualité et le prix du matériel de bricolage ou de maison avant d'acheter : MatosMaison
    Le bouton ne masse pas les pieds, mais ça aide la communauté.

  13. #13
    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
    Points : 4
    Points
    4
    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

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

    Informations professionnelles :
    Activité : Lead Tech Agile

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

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

  15. #15
    Membre actif Avatar de miya
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 469
    Points : 240
    Points
    240
    Par défaut
    Citation Envoyé par pvoncken Voir le message
    Salut,

    Normalement ce type d'erreur apparait au niveau de la compilation Javascript.

    Au moment où GWT compile ton code en Javascript, certains fichiers Java sont absents du classPath.

    Dans ton cas c'est le fichier suivant qui manque :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [ERROR] Line 13: No source code is available for type org.cmn.metier.Article; did you forget to inherit a required module?
    org.cmn.metier.Article.java doit être dans le classpath au moment où le compilo GWT transforme le Java en javascript.
    Salut pvoncken,

    J'ai tilter sur ta phrase concernant le classpath, et si tu pouvais approfondir la réponse, cela m'intéresse.

    D'un point de vue architecture dans un projet GWT, si je veux dissocier ma couche logique/DAO avec celle de GWT, j'aurai à quelque chose près :

    |- projet DAO
    |-- metier
    |-- persistance

    |- projet GWT
    |-- client
    |--- metier

    De mon côté, et rejoignant le collègue dans le post plus haute, je fais donc une transformation de ma classe DAO.metier.A vers une classe GWT.metier.B, pour me permettre d'utiliser mes objets. Tu es entrain de dire que l'on peut éviter cette solution ? en référencent un classpath

    Une idée me vient rapidement à l'esprit, j'expose ici. Je n'ai pas testé ce que je suis entrain de dire.

    Toujours dans un désir de dissocier mes couches, du moins DAO / GWT :

    Pourquoi ne pas créer un projet GWT.DAO qui s'occupe uniquement de contenir le métier avec une couche persistance (ici transformation obligatoire de la persistance vers le modele métier), et un projet GWT.IHM qui se charge de l'IHM. Ainsi dans le module du projet GWT on fait référence au module du projet DAO et nos vues de GWT font directement appel au modele métier du projet GWT.DAO.metier ? A tester ...

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

    Informations professionnelles :
    Activité : Lead Tech Agile

    Informations forums :
    Inscription : Septembre 2004
    Messages : 316
    Points : 417
    Points
    417
    Par défaut
    Salut miya,

    je te confirme que cette stratégie fonctionne. C'est ce que j'ai mis en place.

    Dans ton fichier de configuration du module GWT, le *gwt.xml, tu peux ajouter n'importe quel package afin de transformer ce package en Javascript et de pouvoir l'utiliser dans la couche cliente.

    La seule chose qu'il faut avoir en tête, c'est que le compilo GWT à besoin des fichiers Java de ce package au moment où il compile le Javascript.

    Cela veut dire qu'il faut penser à ajouter en dépendance un jar contenant les sources de ton projet DAO.

    Il faut donc définir dans le pom de ton projet les dépendances vers projetDAO.jar et projetDAO-source.jar.

    Il existe d'autres stratégies mais le principe reste le même: inclure les fichiers Java dans le classpath pour le compilo GWT.

    Je t'invite à lire cet article : http://hugo.developpez.com/tutoriels...ibernate/#LIII même si je ne suis pas d'accord avec certaines de ses conclusions le principe que nous évoqons ici y est expliqué.

  17. #17
    Membre actif Avatar de miya
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 469
    Points : 240
    Points
    240
    Par défaut
    Ok, donc on part du principe que j'ai deux projets GWT, un concernant la DAO et un autre pour les IHM.

    La question qui me vient à l'esprit, c'est que je n'ai aucun entry-point dans mon projet DAO (normal..) est-il possible d'avoir un projet GWT sans entry-point ?

    Dans le GWT.IHM.pom on fait référence à notre projet GWT.DAO ok, mais côté module on le lie aussi, de la facon suivante : <inherits name='fr.projet.gwt.dao'/> ?

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

    Informations professionnelles :
    Activité : Lead Tech Agile

    Informations forums :
    Inscription : Septembre 2004
    Messages : 316
    Points : 417
    Points
    417
    Par défaut
    Voici la solution la plus élégante, selon moi, pour réaliser un projet complet.

    Il faut créer un projet Maven2 parent qui possède 2 modules Maven2. Appelons-le "monprojet".

    Le premier module Maven s'appelera monprojet-core dans lequel tu auras les packages suivant :
    - dao
    - bo (buisness object ou modèle de données)
    - services (les services Spring)

    Ce module est entièrement indépendant de GWT. tu pourrais l'utiliser avec un autre fontal Web.

    Le second module s'appelera monprojet-web dans lequel se trouvera les packages suivant :
    - client (qui est le package client GWT)
    - server (qui contiendra l'implémentation des Rpc)

    le second module contient le fichier monprojet.gwt.xml dans lequel tu vas déclarer les sources suivantes :
    src=client
    src=bo

    Dans ce cas il faut bien penser à inclure les fichiers Java du package bo dans le classpath afin que le compilo GWT puisse transformer les classes se trouvant dans bo en Javascript.

    Il n'y a donc qu'1 module GWT avec un entry point. Le package bo faisant partie de ce module par le biais de la déclaration src= dans le fichier gwt.xml.

  19. #19
    Membre actif Avatar de miya
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 469
    Points : 240
    Points
    240
    Par défaut
    Ok j'y vois beaucoup plus clair à ton explication :

    |-ProjetMaven
    |-- module-maven-core
    |---- DAO
    |---- modele
    |---- services-spring
    |---- pom.xml
    |-- module-maven-web-gwt
    |---- client
    |------ module.gwt.xml
    |---- server
    |---- pom.xml

    Pour ceux qui n'ont pas l'habitude d'utiliser le multimodule : http://java.developpez.com/faq/maven/?page=projet

    De mon côté je bloc (toujours) sur le classpath dont tu parles.

    Lorsque tu parles du classpath, tu fais références au JAVA BUILDER PATH dans les properties ?

    Merci d'avance pour tes explications, qui en guidera plus d'un.

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

    Informations professionnelles :
    Activité : Lead Tech Agile

    Informations forums :
    Inscription : Septembre 2004
    Messages : 316
    Points : 417
    Points
    417
    Par défaut
    Il manque le pom.xml du projet parent dans ton schéma.

    Le classpath, c'est l'ensemble des jar qui sont utilisé par Java pour faire tourner ton application.

    Le pom.xml permet de déclarer les dépendances de ton projet par rapport à des jar. Tous les jars que tu déclare dans le pom vont se retrouver dans le classpath lorsque tu executeras ton projet.

    Il suffit donc que tu génère et que tu déclare en dépandence un jar contenant les fichiers java du module core pour que tout fonctionne correctement.

    Il faut que tu lise la faq Java / Maven : http://java.developpez.com/faq/maven...projet#projet1

    pour générer le jar des sources :
    http://java.developpez.com/faq/maven...ilisation#qr54

    Et la commande mvn install pour installer dans le repo local.

    Tu peux aussi inclure les fichiers Java dans les resource du module core afin que Maven copie les fichiers Java dans le jar. C'est un peu crade mais ca marche.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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