-
1. Re: Problem when trying to access an EJB bean in an Enterpri
jaikiran Nov 9, 2006 4:13 AM (in response to andria-ntoanina)What are the contents of the jndi.properties file? It should contain something like:
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory java.naming.provider.url=jnp://localhost:1099 java.naming.factory.url.pkgs=org.jboss.naming.client j2ee.clientName=TheNameOfYourApplicationClient
-
2. a
andria-ntoanina Nov 9, 2006 7:17 AM (in response to andria-ntoanina)Yes, and I'v put these code into C:\Program Files\jboss-4.0.3\server\default\conf\jndi.properties. But the result is the same. j2ee.clientName not bound.
May be there is a something wrong. I see on the net that the jndi.properties must be in my CLASSPATH. And I don't know how to do that with NetBeans 5.5.
Do you know also how to code application-client.xml? -
3. Re: Problem when trying to access an EJB bean in an Enterpri
jaikiran Nov 9, 2006 7:32 AM (in response to andria-ntoanina)Yes, and I'v put these code into C:\Program Files\jboss-4.0.3\server\default\conf\jndi.properties
That's the wrong file which you edited. You will have to have the jndi.properties file in the application-client's classpath.Do you know also how to code application-client.xml?
Had done it long time back so dont remember the exact contents but this is what i could think about:
application-client.xml:<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE application-client PUBLIC '-//Sun Microsystems, Inc.//DTD J2EE Application Client 1.3//EN' 'http://java.sun.com/dtd/application-client_1_3.dtd'> <application-client> <display-name>My App Client</display-name> <ejb-ref> <ejb-ref-name>ejb/someEJB</ejb-ref-name> <ejb-ref-type>Session</ejb-ref-type> <home>package.HomeClassName</home> <remote>package.RemoteClassName</remote> </ejb-ref> </application-client>
and the jboss-client.xml:<jboss-client> <jndi-name>SampleApplicationClient</jndi-name> <ejb-ref> <ejb-ref-name>ejb/someEJB</ejb-ref-name> <jndi-name>TheJndiNameOfTheEJB</jndi-name> </ejb-ref> </jboss-client>
the jndi.properties in the application client's classpath:java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory java.naming.provider.url=jnp://localhost:1099 java.naming.factory.url.pkgs=org.jboss.naming.client j2ee.clientName=SampleApplicationClient
-
4. Re:
andria-ntoanina Nov 9, 2006 8:15 AM (in response to andria-ntoanina)Here's now my Application-client.xml file:
<?xml version="1.0" encoding="UTF-8"?> <application-client version="1.4" 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/application-client_1_4.xsd"> <display-name>MFEA-client</display-name> <ejb-ref> <ejb-ref-name>ejb/BeanSessionBean</ejb-ref-name> <ejb-ref-type>Session</ejb-ref-type> <home>bean.BeanSessionLocal</home> <remote>bean.BeanSessionRemote</remote> </ejb-ref> </application-client>
jboss-client.xml<?xml version="1.0" encoding="UTF-8"?> <jboss-client> <jndi-name>MFEA-client</jndi-name> <ejb-ref> <ejb-ref-name>ejb/BeanSessionBean</ejb-ref-name> <jndi-name>BeanSessionBean</jndi-name> </ejb-ref> </jboss-client>
my jndi.properties:java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory java.naming.provider.url=jnp://localhost:1099 java.naming.factory.url.pkgs=org.jboss.naming.client j2ee.clientName=MFEA-client
My beans:* * BeanSessionBean.java * * Created on 8 novembre 2006, 17:00 * * To change this template, choose Tools | Template Manager * and open the template in the editor. */ package bean; import javax.ejb.Remote; import javax.ejb.Stateless; /** * * @author hrm */ @Stateless public class BeanSessionBean implements bean.BeanSessionRemote, bean.BeanSessionLocal { /** Creates a new instance of BeanSessionBean */ public BeanSessionBean() { } public double AriaryToFmg(double ariary) { return ariary/5; } }
My local:package bean; import javax.ejb.Local; /** * This is the business interface for BeanSession enterprise bean. */ @Local public interface BeanSessionLocal { }
My Remotepackage bean; import javax.ejb.Remote; import org.jboss.annotation.ejb.RemoteBinding; /** * This is the business interface for BeanSession enterprise bean. */ @RemoteBinding(jndiBinding="MySession") public interface BeanSessionRemote { public double AriaryToFmg(double ariary); }
and now my AppClient:public static void main(String[] args) { try { Context c = new InitialContext(); Context ce = (Context)c.lookup("java:comp/env/ejb"); Object b = c.lookup("java:comp/env/ejb/BeanSessionBean"); /*NamingEnumeration li = ce.list(""); while(li.hasMore()) { NameClassPair a= (NameClassPair)li.next(); System.out.println("ClassName="+a.getClassName()+" Name="+a.getName());; }*/ } catch (NamingException ex) { ex.printStackTrace(); } }
And I got the next exception:javax.naming.NamingException: Could not dereference object [Root exception is javax.naming.NameNotFoundException: BeanSessionBean not bound] at org.jnp.interfaces.NamingContext.resolveLink(NamingContext.java:1052) at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:685) at org.jboss.naming.client.java.javaURLContextFactory$EncContextProxy.invoke(javaURLContextFactory.java:120) at $Proxy0.lookup(Unknown Source) at javax.naming.InitialContext.lookup(InitialContext.java:351) at myfirstenterpriseapplication.Main.main(Main.java:43) Caused by: javax.naming.NameNotFoundException: BeanSessionBean not bound at org.jnp.server.NamingServer.getBinding(NamingServer.java:514) at org.jnp.server.NamingServer.getBinding(NamingServer.java:522) at org.jnp.server.NamingServer.getObject(NamingServer.java:528) at org.jnp.server.NamingServer.lookup(NamingServer.java:281) at sun.reflect.GeneratedMethodAccessor75.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:294) at sun.rmi.transport.Transport$1.run(Transport.java:153) at java.security.AccessController.doPrivileged(Native Method) at sun.rmi.transport.Transport.serviceCall(Transport.java:149) at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:466) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:707) at java.lang.Thread.run(Thread.java:595) at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:247) at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:223) at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:126) at org.jnp.server.NamingServer_Stub.lookup(Unknown Source) at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:610) at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:572) at javax.naming.InitialContext.lookup(InitialContext.java:351) at org.jnp.interfaces.NamingContext.resolveLink(NamingContext.java:1046) ... 5 more
-
5. Re: Problem when trying to access an EJB bean in an Enterpri
jaikiran Nov 9, 2006 8:21 AM (in response to andria-ntoanina)<?xml version="1.0" encoding="UTF-8"?> <jboss-client> <jndi-name>MFEA-client</jndi-name> <ejb-ref> <ejb-ref-name>ejb/BeanSessionBean</ejb-ref-name> <jndi-name>BeanSessionBean</jndi-name> </ejb-ref> </jboss-client>
Shouldn't the jndi name be "MySession" :<?xml version="1.0" encoding="UTF-8"?> <jboss-client> <jndi-name>MFEA-client</jndi-name> <ejb-ref> <ejb-ref-name>ejb/BeanSessionBean</ejb-ref-name> <jndi-name>MySession</jndi-name> </ejb-ref> </jboss-client>
-
6. Re: Problem when trying to access an EJB bean in an Enterpri
andria-ntoanina Nov 9, 2006 8:53 AM (in response to andria-ntoanina)When running the jar
I change my jboss-client.xml as you indicated.
And I got : MySession not bound
Now I reput BeanSessionBean into my jndiname and change@RemoteBinding(jndibinding="MySession") to @Remote
In my main application, I try to see what's in the InitialContext by :Context c = new InitialContext(); Context ce = (Context)c.lookup("java:comp/env/ejb"); //Object b = c.lookup("java:comp/env/ejb/BeanSessionBean"); NamingEnumeration li = ce.list(""); while(li.hasMore()) { NameClassPair a= (NameClassPair)li.next(); System.out.println("ClassName="+a.getClassName()+" Name="+a.getName());; }
in the output, I got:
ClassName=javax.naming.LinkRef Name=BeanSessionBean
there's my BeanSessionBean in the InitialContext.
But when I retry to get my Beans by:Context c = new InitialContext(); Context ce = (Context)c.lookup("java:comp/env/ejb"); Object b = c.lookup("java:comp/env/ejb/BeanSessionBean");
I got something like:
BeanSessionBean not bound -
7. Re: Problem when trying to access an EJB bean in an Enterpri
jaikiran Nov 10, 2006 4:02 AM (in response to andria-ntoanina)I tried it out on my setup and this is what worked for me:
application.xml inside helloworld.ear:<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE application PUBLIC "-//Sun Microsystems, Inc.//DTD J2EE Application 1.3//EN" "http://java.sun.com/dtd/application_1_3.dtd"> <application> <module> <java> helloworld-appclient.jar </java> </module> <module> <ejb> helloworld-ejb.jar </ejb> </module> </application>
application-client.xml in the helloworld-appclient.jar:<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE application-client PUBLIC '-//Sun Microsystems, Inc.//DTD J2EE Application Client 1.3//EN' 'http://java.sun.com/dtd/application-client_1_3.dtd'> <application-client> <display-name>My App Client</display-name> <ejb-ref> <ejb-ref-name>ejb/someEJB</ejb-ref-name> <ejb-ref-type>Session</ejb-ref-type> <home>com.helloworld.ejb.HelloWorldBeanRemoteHome</home> <remote>com.helloworld.ejb.HelloWorldBeanRemote</remote> </ejb-ref> </application-client>
jboss-client.xml inside helloworld-appclient.jar:<jboss-client> <jndi-name>SampleApplicationClient</jndi-name> <ejb-ref> <ejb-ref-name>ejb/someEJB</ejb-ref-name> <jndi-name>com.helloworld.ejb.HelloWorldBean</jndi-name> </ejb-ref> </jboss-client>
All these files are deployed on the server and here's the packaging hierarchy:helloworld.ear | |-------------- META-INF | |---------- application.xml | |-------------- helloworld-appclient.jar | | | |----------- META-INF | | | | | |-------- application-client.xml | | |-------- jboss-client.xml | |------------- helloworld-ejb.jar | | | |----------- META-INF | | | | | |-------- ejb-jar.xml | | |-------- jboss.xml
Now here's the code which does the lookup:package org.myapp; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.rmi.PortableRemoteObject; import com.helloworld.ejb.HelloWorldBeanRemoteHome; public class MyAppClient { /** * @param args */ public static void main(String[] args) { try { Context ctx = new InitialContext(); Object beanHome = ctx.lookup("java:comp/env/ejb/someEJB"); System.out.println("Bean home: " + beanHome); HelloWorldBeanRemoteHome home = (HelloWorldBeanRemoteHome) PortableRemoteObject.narrow(beanHome,HelloWorldBeanRemoteHome.class); System.out.println("Client successful"); } catch (NamingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
Finally, the jndi.properties file which needs to be in the classpath of this class which does the lookup:java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory java.naming.provider.url=jnp://localhost:1099 java.naming.factory.url.pkgs=org.jboss.naming.client j2ee.clientName=SampleApplicationClient
This worked without any issues. -
8. finally, it works!!!!
andria-ntoanina Nov 13, 2006 4:04 AM (in response to andria-ntoanina)First, I look at my jmx-console and in the JNDIView service, I didn't found my EJB Beans. Why? I don't know. But I changed my plateform to J2EE 1.4(I first coded my beans using J2EE 5). Now, when I deploy the beans I found it in the jmx-console.
May be there is a problem using EJB3 with my JBoss 4.0.3. I don't know. The essential is it works.
CODING the client.
I create a simple Java Application. I m using Eclipse.
then I imported my ejb.jar and jbossall-client.jar into my project.
then there is my class implementation:package maki.oim; import java.rmi.RemoteException; import java.util.Properties; import javax.ejb.CreateException; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.rmi.PortableRemoteObject; public class Test { private static String driver="org.jnp.interfaces.NamingContextFactory"; private static String provider="jnp://localhost:1099"; private static String prefixe="org.jboss.naming"; public static ConvertisseurRemote getConvertisseurRemote() { try { Properties env = new Properties(); env.put(Context.INITIAL_CONTEXT_FACTORY,driver); env.put(Context.PROVIDER_URL,provider); env.put(Context.URL_PKG_PREFIXES,prefixe); InitialContext jndiContext; jndiContext = new InitialContext(env); Object ref = jndiContext.lookup("ConvertisseurBean"); ConvertisseurRemoteHome home = (ConvertisseurRemoteHome)PortableRemoteObject.narrow(ref, ConvertisseurRemoteHome.class); return home.create(); } catch (NamingException e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } catch (CreateException e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } } /** * @param args */ public static void main(String[] args) { try { ConvertisseurRemote conv = getConvertisseurRemote(); System.out.println(conv.fmgToArriary(25)); } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
It works fine!! :)
I've tried coding an enterprise client using what jaikiran show but it crash.
May be there's something wrong in my code.Nethertheless, I'll retry and tell you if it success.
Thank you!!!