Bonjour,
J'ai pour le moment créé 2 beans, un bean entité et un bean session.
Voici les interfaces et classes de ces deux beans :
EtudiantLocal
EtudiantLocalHome
EtudiantBean
EtudiantController
EtudiantControllerHome
EtudiantControllerBean
Comme vous pouvez le constater, l'Entity bean 'Etudiant' dispose d'une interface locale (qui sera utilisée par le session bean controlleur), et le Session bean 'EtudiantController' d'une interface remote (qui sera utilisée par le client).
J'utilise JBOSS 4.0.4 et voici mon descripteur de déploiement (ejb-jar.xml) de mes beans:
************************
<?xml version="1.0"?>
<!DOCTYPE ejb-jar PUBLIC
'-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 1.1//EN'
'http://java.sun.com/j2ee/dtds/ejb-jar_2_0.dtd'>
<ejb-jar>
<enterprise-beans>
<session>
<ejb-name>EtudiantControllerEJB</ejb-name>
<home>com.ejb.etudiant.EtudiantControllerHome</home>
<remote>com.ejb.etudiant.EtudiantController</remote>
<ejb-class>com.ejb.etudiant.EtudiantControllerBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
<ejb-local-ref>
<ejb-ref-name>ejb/Etudiant</ejb-ref-name>
<ejb-ref-type>Entity</ejb-ref-type>
<local-home>com.ejb.etudiant.EtudiantHome</local-home>
<local>com.ejb.etudiant.Etudiant</local>
<ejb-link>EtudiantEJB</ejb-link>
</ejb-local-ref>
<resource-ref>
<res-ref-name>jdbc/EtudiantDS</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</session>
<entity>
<ejb-name>EtudiantEJB</ejb-name>
<local-home>com.ejb.etudiant.EtudiantHome</local-home>
<local>com.ejb.etudiant.Etudiant</local>
<ejb-class>com.ejb.etudiant.EtudiantBean</ejb-class>
<persistence-type>Bean</persistence-type>
<prim-key-class>java.lang.Integer</prim-key-class>
<reentrant>False</reentrant>
<resource-ref>
<res-ref-name>jdbc/EtudiantDS</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</entity>
</enterprise-beans>
<assembly-descriptor></assembly-descriptor>
</ejb-jar>
**************************************
Dans le client afin de récupérer une instance de l'interface distante, j'effectue le code suivant (qui fonctionne) :
***************************************
Properties properties = new Properties();
properties = new Properties();
properties.put("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");
properties.put("java.naming.factory.url.pkgs","org.jboss.naming:org.jnp.interfaces");
properties.put("java.naming.provider.url", "jnp://127.0.0.1:1099");
properties.put("jnp.disableDiscovery", "true");
InitialContext initial = new InitialContext(properties);
Object objref = initial.lookup("EtudiantControllerEJB");
EtudiantControllerHome etudiantControllerHome = (EtudiantControllerHome ) PortableRemoteObject.narrow(objref, EtudiantControllerHome .class);
EtudiantController etudiantController = etudiantControllerHome.create();
********************************
Mon problème est le suivant: depuis mon session bean, il me faut récupérer une instance vers l'interface locale de mon entity bean (je fais cela dans la methode ejbCreate() du session bean en réalité), j'effectue donc le code suivant :
**************************
InitialContext initial = new InitialContext();
Object objref = initial.lookup("EtudiantEJB");
EtudiantHome etudiant = (EtudiantHome) PortableRemoteObject.narrow(objref, EtudiantHome.class);
*************************************
Or lors de l'éxecution, j'obtiens l'erreur suivant de la part de JBoss :
*************************************
05:15:50,147 INFO [EjbModule] Deploying EtudiantEJB
05:15:50,562 INFO [EjbModule] Deploying EtudiantControllerEJB
05:15:51,017 INFO [BaseLocalProxyFactory] Bound EJB LocalHome 'EtudiantEJB' to jndi 'local/EtudiantEJB@30122033'
05:15:51,434 INFO [ProxyFactory] Bound EJB Home 'EtudiantControllerEJB' to jndi 'EtudiantControllerEJB'
05:15:51,470 INFO [EJBDeployer] Deployed: file:/home/laurent/jboss-4.0.4.GA/server/default/deploy/ejb.jar
05:16:04,504 ERROR [LogInterceptor] EJBException in method: public abstract com.ejb.etudiant.EtudiantController com.ejb.etudiant.EtudiantControllerHome.create() throws java.rmi.RemoteException,javax.ejb.CreateException, causedBy:
javax.ejb.EJBException: ejbCreate: EtudiantEJB not bound
at com.ejb.etudiant.EtudiantControllerBean.ejbCreate(EtudiantControllerBean.java:383)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
******************************************
Ca fait des heures et des heures que je cherche une solution à ce problème et je reste vraiment bloqué. Est-ce du au fait que j'essaie de me connecter un bean possédant une interface locale? Que dois-je mettre dans le lookup? Mon ejb-jar.xml est-il configuré correctement? JE VOUS EN SUPPLIE AIDEZ MOI!!
Partager