[ejb] petit probleme avec le context.lookup()

petit probleme avec le context.lookup() [ejb] - Java - Programmation

Marsh Posté le 19-10-2009 à 08:31:11    

voila je me suis lancé dans un projet de serveur et celui ci a besoin d'une base de donnée. j'ai decidé de créé le necessaire en ejb dans le but de le rendre facilement accessible via un client mais j'ai un petit probleme.
 
j'ai créé mon ejb et porté celui ci sur glassfish, il apparait dans "module ejb"
 
sur mon client maintenant j'essaye d'acceder a glassfish et de le recuperer mais bien que j'ai pas mal avancé dans la comprehension des ejb un probleme persiste:
 
j'ai soit: EJBBusinesRemote not found
soit: ejb ref resolution error for remote business interfaceEJBBusines.EJBBusinesRemote
 
 
selon que j'itilise :
-ctx.lookup("EJBBusinesRemote" );
ou
-ctx.lookup("EJBBusines.EJBBusinesRemote" );
 
 
voila le mini morceau de code que j'ai:

Code :
  1. try
  2.         {
  3.             Properties props = new Properties();
  4.             props.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.enterprise.naming.SerialInitContextFactory" );
  5.             props.put(Context.PROVIDER_URL,"iiop://127.0.0.1:4849" );
  6.             Context ctx = new InitialContext(props);
  7.             Object ref = (EJBBusinesRemote) ctx.lookup("EJBBusines.EJBBusinesRemote" );
  8.             EJB = (EJBBusinesBean)PortableRemoteObject.narrow(ref,EJBBusinesBean.class);
  9.            
  10.         }
  11.         catch(Exception ex){
  12.             System.out.println("erreur: "+ex.getMessage());
  13.             System.exit(-1);
  14.         }


glassfish écoutant bien sur le port 4849 (si par défaut c'était le 4848 qu'il fallait utiliser et non le 3700 comme j'ai vu ailleurs)
 
je travaille sous kate pour ce projet (qui a dit maso?) mais ça vient de la lenteur de mon pc du coup je modifis les fichier dans kate et compile via le reseau.
je vous marque donc les import du client:
 

Code :
  1. import EJBBusines.*;
  2. import java.awt.event.KeyEvent;
  3. import java.util.Properties;
  4. import javax.ejb.EJB;
  5. import javax.naming.*;
  6. import javax.rmi.PortableRemoteObject;


ainsi que la declaration de mon ejb:

Code :
  1. @Stateful(name = "EJBBusines" )
  2. public class EJBBusinesBean implements EJBBusinesRemote {
  3. ...}


mais un doute m'assaille: ne faut il pas déclarer l'ejb sur l'interface remote aussi/plutot?
 
voila merci a celui qui aurait un idée :)


Message édité par kranagard le 19-10-2009 à 17:56:04
Reply

Marsh Posté le 19-10-2009 à 08:31:11   

Reply

Marsh Posté le 19-10-2009 à 11:36:34    

Tu dois ajouter une annotation @Remote sur l'interface EJBBusinesRemote aussi, et tu peux ajouter à ton annotation sur EJBBusinesBean le paramètre mappedName="EJBBusines" afin de changer le nom par défaut que tu dois spécifier dans ta requête pour te connecter à l'EJB. Par défaut je crois que le nom est "NomDuBean/remote" ou "NomDuBean/local" selon le type d'EJB, dans ton cas ce serait donc "EJBBusines/local" ce qui explique pourquoi tu ne parviens pas à y accéder. Mais je ne suis pas certain que ce soit le cas dans Glassfish donc le mieux est de lire la doc de Glassfish à ce sujet ou spécifier un mappedName.
 
Un petit tutoriel trouvé sur Google: http://www.webagesolutions.com/kno [...] index.html
 
Et enfin sache que Busines s'écrit en réalité "Business".

Reply

Marsh Posté le 19-10-2009 à 11:54:04    

je viens de voir un truc étrange, je suis passé sous netbeans pour voir un peu les annotations et j'ai corrigé deux trois trucs (notamment le @remote et le fait que j'avais deux ejb session...) mais toujours impossible de le déployer.
par contre le déploiement via l'interface web de glassfish fonctionne parfaitement lui, sur le même jar...
du coup je me demande un peu pourquoi netbeans ne le déploie pas si j'y arrive par ailleurs. mais soit, ce n'est pas le problème premier.
 
j'ai placer un mappedName et maintenant j'ai ce code:
 

Code :
  1. package EJBBusiness;
  2. import java.sql.*;
  3. import javax.ejb.Remote;
  4. /**
  5. *
  6. * @author jerome
  7. */
  8. @Remote
  9. public interface EJBBusinessRemote
  10. {
  11.     public void setProperties(String ip,String id,String pass)throws SQLException, ClassNotFoundException;
  12.     public void modifier(int table,int column[],String values[]) throws SQLException;
  13.     public void ajouter(int table,String values[]) throws SQLException;
  14.     public void supprimer(int table,int id) throws SQLException;
  15.     public ResultSet lister(int table) throws SQLException;
  16.     public ResultSet search(int table,String nom) throws SQLException;
  17. }


 
 

Code :
  1. package EJBBusiness;
  2. import EJBFacade.FacadeClubBean;
  3. import EJBFacade.FacadeManagerBean;
  4. import EJBFacade.FacadeSportifBean;
  5. import java.io.FileNotFoundException;
  6. import java.io.IOException;
  7. import java.sql.ResultSet;
  8. import java.sql.SQLException;
  9. import javax.ejb.Stateful;
  10. /**
  11. *
  12. * @author jerome
  13. */
  14. @Stateful(mappedName="EJBBusiness" )
  15. public class EJBBusiness implements EJBBusinessRemote {
  16.     private EJBFacade.FacadeClubBean club;
  17.     private EJBFacade.FacadeManagerBean manager;
  18.     private EJBFacade.FacadeSportifBean sportif;
  19.     public EJBBusiness() throws SQLException, ClassNotFoundException, FileNotFoundException, IOException
  20.     {
  21.         club = new FacadeClubBean();
  22.         manager = new FacadeManagerBean();
  23.         sportif = new FacadeSportifBean();
  24.     }
  25.     public void setProperties(String ip,String id,String pass) throws SQLException, ClassNotFoundException
  26.     {
  27.         club.OpenDB(ip,id,pass);
  28.         sportif.OpenDB(ip,id,pass);
  29.         manager.OpenDB(ip,id,pass);
  30.     }
  31.     public void modifier(int table, int[] column, String[] values) throws SQLException
  32.     {
  33.         switch(table)
  34.         {
  35.             case 1: //club
  36.                 club.modif(Integer.parseInt(values[0]), column, values);
  37.                 break;
  38.             case 2: //sportif
  39.                 sportif.modif(Integer.parseInt(values[0]), column, values);
  40.                 break;
  41.             case 3: //manager
  42.                 manager.modif(Integer.parseInt(values[0]), column, values);
  43.                 break;
  44.             default: break;
  45.         }
  46.     }
  47.     public void ajouter(int table, String[] values) throws SQLException
  48.     {
  49.         switch(table)
  50.         {
  51.             case 1: //club
  52.                 club.add(values);
  53.                 break;
  54.             case 2: //sportif
  55.                 sportif.add(values);
  56.                 break;
  57.             case 3: //manager
  58.                 manager.add(values);
  59.                 break;
  60.             default: break;
  61.         }
  62.     }
  63.     public void supprimer(int table, int id) throws SQLException
  64.     {
  65.         switch(table)
  66.         {
  67.             case 1: //club
  68.                 club.sup(id);
  69.                 break;
  70.             case 2: //sportif
  71.                 sportif.sup(id);
  72.                 break;
  73.             case 3: //manager
  74.                 manager.sup(id);
  75.                 break;
  76.             default: break;
  77.         }
  78.     }
  79.     public ResultSet lister(int table) throws SQLException
  80.     {
  81.         switch(table)
  82.         {
  83.             case 1: //club
  84.                 return club.lister();
  85.             case 2: //sportif
  86.                 return sportif.lister();
  87.             case 3: //manager
  88.                 return manager.lister();
  89.             default: return null;
  90.         }
  91.     }
  92.     public ResultSet search(int table,String nom) throws SQLException
  93.     {
  94.         switch(table)
  95.         {
  96.             case 1: //club
  97.                 return club.search(nom);
  98.             case 2: //sportif
  99.                 return sportif.search(nom);
  100.             case 3: //manager
  101.                 return manager.search(nom);
  102.             default: return null;
  103.         }
  104.     }
  105. }


 
le client:
 

Code :
  1. package sysdysClient;
  2. import EJBBusiness.EJBBusiness;
  3. import java.awt.event.KeyEvent;
  4. import java.io.FileInputStream;
  5. import java.util.Properties;
  6. import javax.ejb.EJB;
  7. import javax.naming.*;
  8. /**
  9. *
  10. * @author Ghoost
  11. */
  12. public class BaseApplic extends javax.swing.JFrame {
  13.     @EJB
  14.     public static EJBBusiness EJBB;
  15.     /** Creates new form Ajouter */
  16.     public BaseApplic() {
  17.         try
  18.         {
  19.             Properties props = new Properties();
  20.             props.load(new FileInputStream("conf.properties" ));
  21.             InitialContext ctx = new InitialContext();
  22.             EJBB = (EJBBusiness) ctx.lookup("EJBBusiness" );
  23.             EJBB.setProperties(props.getProperty("ip" ),props.getProperty("id" ),props.getProperty("pass" ));
  24.         }
  25.         catch(Exception ex){
  26.             System.out.println("erreur: "+ex.getMessage());
  27.             System.exit(-1);
  28.         }
  29. ...


 
 
le deployement des deux se fait bien sous la page web de glassfish donc, je recupere bien le jar avec la commande

Code :
  1. asadmin get-client-stubs --user admin --appname sysdisClient .\


 
mais le probleme reste le meme:
 

Code :
  1. erreur: ejb ref resolution error for remote business interface EJBBusiness.EJBBusinessRemote


 
[EDIT] j'ai déjà fait le test du hello en ejb et il fonctionne correctement, je suis justement partie de ce projet pour développer le miens sachant que les libs etaient bonne :)


Message édité par kranagard le 19-10-2009 à 11:58:39
Reply

Marsh Posté le 19-10-2009 à 17:54:55    

j'ai reinstallé glassfish entierement, changé les ports d'utilisation (j'ai decouvert qu'oracle utilisait les memes...) et maintenant le deploiement sous netbeans fonctionne (ça accelere pas mal les tests)
 
mais j'ai toujours la meme erreur alors que le deploiement du mon ejb ainsi que de mon client se passent bien.
 
 
erreur: EJBBusiness not found
 
voila les entete de ma classe et de son remote:
 

Code :
  1. package EJBBusiness;
  2. import java.sql.*;
  3. import javax.ejb.Remote;
  4. /**
  5. *
  6. * @author jerome
  7. */
  8. @Remote
  9. public interface EJBBusinessRemote
  10. {
  11. ...
  12. }


 

Code :
  1. package EJBBusiness;
  2. import Facade.*;
  3. import java.io.FileNotFoundException;
  4. import java.io.IOException;
  5. import java.sql.ResultSet;
  6. import java.sql.SQLException;
  7. import javax.ejb.Stateful;
  8. /**
  9. *
  10. * @author jerome
  11. */
  12. @Stateful(mappedName="EJBBusiness" )
  13. public class EJBBusiness implements EJBBusinessRemote {
  14. ...}


Message édité par kranagard le 19-10-2009 à 17:55:28
Reply

Marsh Posté le 19-10-2009 à 22:24:17    

Tu dois travailler avec ton interface dans le code client, pas avec l'implémentation. La classe qui implémente l'interface ne doit pas être déployée dans le client non plus. Dans le client tu dois donc faire une requête JNDI et faire un cast du résultat en "EJBBusinessRemote".

Reply

Marsh Posté le 21-10-2009 à 12:06:50    

Si tu as changé les ports et d'autres paramètres, tu dois fournir les nouveaux paramètres au client aussi, soit via un fichier de properties externe (j'ai oublié le nom) soit via une hashtable de paramètres que tu passes à l'InitialContext. Vérifie également que ton client possède tous les jar nécessaires dans son classpath parce que normalement un client EJB doit être déployé dans un serveur J2EE, si tu crées un client autonome tu dois l'accompagner de quelques fichiers jar du serveur correspondant (comme montré dans le tutoriel).

Reply

Marsh Posté le 21-10-2009 à 12:22:53    

je l'ai deployé sur le serveur et tout fonctionne maintenant merci a toi.
 
une derniere question cependant:
 

Citation :

La classe qui implémente l'interface ne doit pas être déployée dans le client non plus


 
je dois faire comment pour ça? pour le moment j'ai le jar de mon ejb en import (ce qui me parait pas normal) mais a l'execution c'est bien le serveur qui tourne.
 
je dois juste mettre l'interface dans le client, juste changer le lookup?

Reply

Marsh Posté le 21-10-2009 à 21:42:32    

C'est tout l'intérêt d'avoir une interface, pour ne pas avoir à déployer l'implémentation avec le client!
 
Si tu mets le jar du serveur complet dans le client ça fonctionnera mais tu n'as besoin que de l'interface. Fais un jar supplémentaire qui contient uniquement les interfaces et déploie-le avec le serveur ET le client, comme ça tu n'auras pas à déployer le serveur complet avec le client.

Reply

Marsh Posté le 22-10-2009 à 00:06:31    

j'ai tout le set d'interface vu que j'essaye le plus possible de programmer "propre" donc je  n'ai rien a changer ça tombe bien :)
merci a toi pour tes reponses.
 
j'ai juste une derniere requete,  j'ai créé mes ejb entitées et façades mais j'ai un petit probleme lors de l'appel:
 

Code :
  1. oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider
  2. Returned null to createEntityManagerFactory.


 

Code :
  1. EntityManagerFactory emf = Persistence.createEntityManagerFactory("EJBBusinessPU" );
  2.         em = emf.createEntityManager();


 
EJBBusinessPU etant mon persistenceunit (declaré dans persistence.xml)
j'ai pas eu beaucoup de temps pour chercher et j'aurai peut etre la reponse avant de revenir mais la je suis trop crevé pour y reflechir donc si quelqu'un passe par la et a une idée :)


Message édité par kranagard le 22-10-2009 à 00:08:10
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed