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

Java EE Discussion :

Communication vers un EJB depuis un client standalone [EJB3]


Sujet :

Java EE

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné

    Homme Profil pro
    Développeur J2EE Senior
    Inscrit en
    Mai 2008
    Messages
    419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur J2EE Senior
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2008
    Messages : 419
    Par défaut Communication vers un EJB depuis un client standalone
    Bonjour à tous

    J'ai un problème assez ennuyeux: L'exemple le plus bateau possible de communication vers un EJB depuis un client standalone ne fonctionne pas.

    J'ai d'abord créé un EJB stateless bateau:
    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
    package test;
    import javax.ejb.Stateless;
     
    /**
     * Session Bean implementation class Say_Hello
     */
    @Stateless(mappedName = "Say_Hello")
    public class Say_Hello implements Say_HelloRemote {
     
            // Default constructor. 
            public Say_Hello() {}
     
            @Override
    	public String sayHello() {
    		return "Hello World";
    	}
    }
    Auquel a été automatiquement adjoint une interface remote:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    package test;
    import javax.ejb.Remote;
     
    @Remote
    public interface Say_HelloRemote {
    	public String sayHello();
    }
    J'ai déployé tout ce joli monde sur le serveur, et j'ai vérifié via la console d'administration web de glassfish qu'il n'y avait pas de problème de déploiment. Ensuite je me suis inspiré de la FAQ de Glassfish et du tutoriel "Elvis meet Glassfish" pour créer un client standalone vraiment pas compliqué:
    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
    package example.rmiClient;
    import javax.naming.InitialContext;
     
    public class Client {
     
    	public static void main(String[] args) throws Exception{
     
    		// GET INITIAL CONTEXT
    		InitialContext ctx=new InitialContext();
     
    		// GET REFERENCE ON REMOTE INTERFACE
    		Object o=ctx.lookup("Say_Hello");
    		Say_HelloRemote say_HelloRemote=(Say_HelloRemote)o;
     
    		// TRY TO USE REMOTE INTERFACE
    		String response=say_HelloRemote.sayHello();
    		System.out.println(response);
    	}
    }
    Avec bien sûr dans le même package une jolie petite interface toute mignonne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    package example.rmiClient;
     
    public interface Say_HelloRemote {
    	public String sayHello();
    }
    Je compile le client, et à l'éxécution, j'ai ça:
    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
    Exception in thread "main" javax.naming.NamingException: ejb ref resolution error for remote business interfacetest.Say_HelloRemote [Root exception is java.lang.ClassNotFoundException: test.Say_HelloRemote]
    	at com.sun.ejb.EJBUtils.lookupRemote30BusinessObject(EJBUtils.java:425)
    	at com.sun.ejb.containers.RemoteBusinessObjectFactory.getObjectInstance(RemoteBusinessObjectFactory.java:74)
    	at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:304)
    	at com.sun.enterprise.naming.SerialContext.lookup(SerialContext.java:414)
    	at javax.naming.InitialContext.lookup(InitialContext.java:392)
    	at example.rmiClient.Client.main(Client.java:12)
    Caused by: java.lang.ClassNotFoundException: test.Say_HelloRemote
    	at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
    	at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
    	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    	at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
    	at com.sun.ejb.EJBUtils.getBusinessIntfClassLoader(EJBUtils.java:679)
    	at com.sun.ejb.EJBUtils.lookupRemote30BusinessObject(EJBUtils.java:348)
    	... 5 more
    Voila, donc ça plante sur le ctx.lookup, et je ne vois vraiment pas pourquoi. Y aurait-il un détail évident que j'aurais oublié? Au début je me suis dit que c'était peut être un problème de nom de package, mais à la réflexion, je ne vois pas pourquoi ça rentrerait en compte..

    Je précise aussi qu'au début je n'étais pas passé par un objet o intermédiaire. Je l'ai rajouté pour être sûr que c'était bien le ctx.lookup qui faisait planter, et pas le cast de l'objet qu'il retourne..

    Merci de vos réponses
    Mes cours sur l'écosystème Java EE - N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  2. #2
    Membre chevronné

    Homme Profil pro
    Développeur J2EE Senior
    Inscrit en
    Mai 2008
    Messages
    419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur J2EE Senior
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2008
    Messages : 419
    Par défaut
    Bon laissez tomber, j'ai finalement trouvé, c'était bien un problème de package. En gros il faut que le package dans lequel se trouve l'interface remote sur le serveur et celui dans lequel se trouve la même interface chez le client portent le même nom, car sinon il ne trouve pas l'interface.
    Mes cours sur l'écosystème Java EE - N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre chevronné Avatar de Claythest
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    558
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 558
    Par défaut
    Intéressant, ton serveur d'application est Glassfish ?

    --------

    Sinon, une autre solution c'est dans l'annotation @Local ou @Remote de ton bean préciser le paramètre value=MonInterfaceDuBean.class, ça devrait marcher aussi

  4. #4
    Membre chevronné

    Homme Profil pro
    Développeur J2EE Senior
    Inscrit en
    Mai 2008
    Messages
    419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur J2EE Senior
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2008
    Messages : 419
    Par défaut
    Oui j'utilise Glassfish v2.1 pour être précis. Merci pour le conseil.

    Au passage, j'ai aussi essayé de faire un truc un peu plus vicelar:

    Un client standelone interroge un EJB tournant dans glassfish, lequel EJB se connecte en RMI à un client RMI, invoque l'une de ses interfaces et retourne la réponse au client standalone. Mais pour l'instant ça ne marche pas trop. Pour mémoire, j'ai essayé avec les deux méthodes suivantes, et j'ai reçu des avertissements d'incompatibilité ou de désactivation de RMI pour des raisons de sécurité. Pour l'instant je vais laisser tomber...

    Ces deux méthodes sont lancées par le serveur
    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
    	public String tryRegistry(String input){
    		String response=new String (input);
    		try {
    			Registry registry = LocateRegistry.getRegistry();
    			Hello stub = (Hello) registry.lookup("Hello");
    			response+= stub.sayHello();
    		} catch (RemoteException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (NotBoundException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		return response;
    	}
     
    	public String tryCtx(String input){
    		String response=new String(input);
     
    		try {
    			InitialContext ctx=new InitialContext();
    			Hello stub = (Hello) ctx.lookup("Hello");
    			response+= stub.sayHello();
    		} catch (NamingException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (RemoteException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		return response;
    	}
    Mes cours sur l'écosystème Java EE - N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. Transfert d'une image depuis un client Android distant vers un serveur
    Par HoussemBk dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 24/03/2015, 00h12
  2. transfert du fichier depuis le client vers le serveur
    Par imenboukhris dans le forum GWT et Vaadin
    Réponses: 1
    Dernier message: 23/04/2014, 11h45
  3. [EJB3.1] Comment appeler des EJB depuis un client Swing
    Par levolutionniste dans le forum Java EE
    Réponses: 2
    Dernier message: 25/03/2012, 20h49
  4. Réponses: 1
    Dernier message: 06/12/2011, 16h25
  5. [EJB3 Entity] Retour impossible de l'objet du Bean vers le client standalone
    Par Mister Nono dans le forum Java EE
    Réponses: 6
    Dernier message: 23/12/2008, 18h35

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