[EJB]Utilisation d'EJB entité CMP 2.x avec Websphere 6
Je suis entrain d'apprendre à programmer des ejbs et plus particulièrement des EJB entity CMP 2.x avec websphere 6. et pour l'instant je me casse la tête dessus sans trouver de solution. J'ai suivi toutes les instructions pour créer une tel ejb. (j'utilise éclipse J2EE).
je dispose de 4 classes :
Code:
1 2 3 4 5
|
User
UserHome
UserBeam
UserPK |
mon EJB doit accéder à une base de données MySQL qui possède un nom JNDI dans mon serveur : jdbc/mysqlNico
voici le contenu de mon ejb-jar.xml :
Code:
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
|
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar id="ejb-jar_ID"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd"
version="2.1">
<description>Mon premier EJB simple</description>
<display-name>AzurMenuiserieEJB</display-name>
<enterprise-beans>
<entity id="ContainerManagedEntity_1">
<description>User CMP 2.0</description>
<display-name>User1 access CMP 2.0</display-name>
<ejb-name>User1</ejb-name>
<local-home>com.nico.user2x.UserHome</local-home>
<local>com.nico.user2x.User</local>
<ejb-class>com.nico.user2x.UserBean</ejb-class>
<persistence-type>Container</persistence-type>
<prim-key-class>com.nico.user2x.UserPK</prim-key-class>
<reentrant>false</reentrant>
<cmp-version>2.x</cmp-version>
<abstract-schema-name>user1</abstract-schema-name>
<cmp-field>
<field-name>userid</field-name>
</cmp-field>
<cmp-field>
<field-name>firstname</field-name>
</cmp-field>
<cmp-field>
<field-name>lastname</field-name>
</cmp-field>
<cmp-field>
<field-name>login</field-name>
</cmp-field>
<cmp-field>
<field-name>password</field-name>
</cmp-field>
</entity>
</enterprise-beans>
<assembly-descriptor>
<method-permission>
<description>User1 permissions</description>
<unchecked/>
<method>
<ejb-name>User1</ejb-name>
<method-name>*</method-name>
</method>
</method-permission>
</assembly-descriptor>
</ejb-jar> |
tout ceci est contenu dans une archive JAR pour ejb que j'ai déployé dans mon application, websphere.
J'essaye d'accéder à cet ejb via un JSP contenu dans un module Web.
voici son web.xml :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
| <?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="WebApp_ID" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>NicoWeb</display-name>
<welcome-file-list>
...
</welcome-file-list>
<ejb-local-ref id="EjbRef_1126088135893">
<ejb-ref-name>User1</ejb-ref-name>
<ejb-ref-type>Entity</ejb-ref-type>
<local-home>com.nico.user2x.UserHome</local-home>
<local>com.nico.user2x.User</local>
</ejb-local-ref>
</web-app> |
pour accèder à mon ejb, je fait :
Code:
1 2 3
|
Context ctxt=new InitialContext();
Object objref=ctxt.lookup("User1"); |
Et là, ça plante :
Citation:
EJB error : Context: geoNode01Cell/nodes/geoNode01/servers/server1, name: User1: First component in name User1 not found.
com.ibm.ws.naming.jndicos.CNContextImpl.processNotFoundException(CNContextImpl.java:4394)
com.ibm.ws.naming.jndicos.CNContextImpl.doLookup(CNContextImpl.java:1784)
com.ibm.ws.naming.jndicos.CNContextImpl.doLookup(CNContextImpl.java:1737)
com.ibm.ws.naming.jndicos.CNContextImpl.lookupExt(CNContextImpl.java:1444)
com.ibm.ws.naming.jndicos.CNContextImpl.lookup(CNContextImpl.java:1324)
com.ibm.ws.naming.util.WsnInitCtx.lookup(WsnInitCtx.java:144)
javax.naming.InitialContext.lookup(InitialContext.java:361)
com.ibm._jsp._test._jspService(_test.java:94)
com.ibm.ws.jsp.runtime.HttpJspBase.service(HttpJspBase.java:88)
javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1212)
com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:629)
com.ibm.wsspi.webcontainer.servlet.GenericServletWrapper.handleRequest(GenericServletWrapper.java:117)
com.ibm.ws.jsp.webcontainerext.JSPExtensionServletWrapper.handleRequest(JSPExtensionServletWrapper.java:171)
com.ibm.ws.webcontainer.servlet.CacheServletWrapper.handleRequest(CacheServletWrapper.java:80)
com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:1657)
com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:77)
com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:421)
com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewInformation(HttpInboundLink.java:367)
com.ibm.ws.http.channel.inbound.impl.HttpICLReadCallback.complete(HttpICLReadCallback.java:94)
com.ibm.ws.tcp.channel.impl.WorkQueueManager.requestComplete(WorkQueueManager.java:548)
com.ibm.ws.tcp.channel.impl.WorkQueueManager.attemptIO(WorkQueueManager.java(Compiled Code))
com.ibm.ws.tcp.channel.impl.WorkQueueManager.workerRun(WorkQueueManager.java:934)
com.ibm.ws.tcp.channel.impl.WorkQueueManager$Worker.run(WorkQueueManager.java:1021)
com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1332)
bref, il n'a pas l'air de trouver mon EJB alors qu'il est bien présent dans la liste de mes ejb dans ma console d'admin avec le nom : User1
J'ai testé plein de possibilités : rien ne marche. Je ne sais plus quoi faire. Est-ce que quelqu'un saurait-il s'il me manque qqc?
Merci pour tous conseils?
Majenior
[Modéré par Didier] : ajout de tag dans le titre - Les règles du forum Java
[Résolu]LA réponse est toute simple
l'erreur est dans le code d'appel de l'EJB. J'ai oublié de mettre devant le nom de mon EJB : java:com/env
Code:
1 2 3
|
Context ctxt=new InitialContext();
ClassHome home=(ClassHome)ctxt.lookup("java:comp/env/User1"); |
bref, dans les ejbs 1.1, j'ai l'impression que ce n'est pas obligé. En tout cas, chez moi, ça ne marche pas, mais pour lesEJB2.0, il faut spécifier "java:comp/env/".
Si qqn a plus d'infos sur tout ça, je suis prenneur!!
Re: [Résolu]LA réponse est toute simple
Citation:
Envoyé par majenior
l'erreur est dans le code d'appel de l'EJB. J'ai oublié de mettre devant le nom de mon EJB : java:com/env
Code:
1 2 3
|
Context ctxt=new InitialContext();
ClassHome home=(ClassHome)ctxt.lookup("java:comp/env/User1"); |
bref, dans les ejbs 1.1, j'ai l'impression que ce n'est pas obligé. En tout cas, chez moi, ça ne marche pas, mais pour lesEJB2.0, il faut spécifier "java:comp/env/".
Si qqn a plus d'infos sur tout ça, je suis prenneur!!
en fait dans les ejb 2.x pour faire un lookup, tu as deux cas
1/ Cas ou ton ejb est un ejb local
Code:
1 2 3
|
Context ctxt=new InitialContext();
ClassHome home=(ClassHome)ctxt.lookup("java:comp/env/ejbName"); |
2/Cas ou ton ejb est un ejb remote
Code:
1 2 3
|
Context ctxt=new InitialContext();
ClassHome home=(ClassHome)ctxt.lookup("ejbName"); |