aspose file tools*
The moose likes JBoss/WildFly and the fly likes Running EJB 3.0 Session Bean in JBoss Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login


Win a copy of Spring in Action this week in the Spring forum!
JavaRanch » Java Forums » Products » JBoss/WildFly
Bookmark "Running EJB 3.0 Session Bean in JBoss" Watch "Running EJB 3.0 Session Bean in JBoss" New topic
Author

Running EJB 3.0 Session Bean in JBoss

Reema Patel
Ranch Hand

Joined: Jan 26, 2006
Posts: 169
I�m facing problems in running a simple Session bean example based on EJB 3.0 spec. For better understand, I have enumerated the following points:-

1.I have installed JBoss AS 4 with EJB support
2.I have set the environment variables (CLASSPATH, JBOSS_HOME etc) appropriately for the required JAR files.
3.Following are the source code files-
//SimpleSession.java
package beans;

import javax.ejb.Remote;

@Remote
public interface SimpleSession
{
public String getEchoString(String clientString);
}

//SimpleSessionBean.java
package beans;

import javax.ejb.Stateless;

@Stateless
public class SimpleSessionBean implements SimpleSession {
public String getEchoString(String clientString) {
return clientString + " - from session bean";
}
}

//impleSessionClient.java
package client;

import beans.SimpleSession;
import javax.naming.InitialContext;

public class SimpleSessionClient {
public static void main(String[] args) throws Exception
{
InitialContext ctx = new InitialContext();
SimpleSession simpleSession
= (SimpleSession) ctx.lookup(SimpleSession.class.getName());
for (int i = 0; i < args.length; i++) {
String returnedString = simpleSession.getEchoString(args[i]);
System.out.println("sent string: " + args[i] +", received string: " + returnedString);
}
}
}

4.This is how I have compiled my code
javac -d . client/*.java
javac -d . beans/*.java

5.And, this is how I have created the ejb3 JAR file
jar cf SimpleSessionApp.ejb3 beans\*.java

6.For deployment, I have copied the JAR file created in step 5 inside the %JBOSS_HOME%/server/all/deploy directory
7.Finally, I�m running the client as shown below:
java
-Djava.naming.factory.initial=
org.jnp.interfaces.NamingContextFactory
-Djava.naming.factory.url.pkgs=
org.jboss.naming rg.jnp.interfaces
-Djava.naming.provider.url=
localhost client.SimpleSessionClient
Now is the time for all good men

But, unfortunately I�m getting the following run-time error
Exception in thread "main" javax.naming.NameNotFoundException: beans.SimpleSession not bound

Can anybody pls let me know the cause with suggestions to recover from the errors.

In anticipation

--Reema
SCJP
Jagmohan Negi
Greenhorn

Joined: Aug 24, 2005
Posts: 27
Check if the EJB is deployed or not.
Nikhil Jain
Ranch Hand

Joined: May 15, 2005
Posts: 385
Hi,

I am facing the same problem. Have been trying this for past 2 days. What is the solution.


SCJP 1.4, SCWCD 1.4, SCBCD 1.5
Jaikiran Pai
Marshal

Joined: Jul 20, 2005
Posts: 10202
    
166

Please provide more details about your application and the exception that you are seeing.


[My Blog] [JavaRanch Journal]
Mark Spritzler
ranger
Sheriff

Joined: Feb 05, 2001
Posts: 17257
    
    6

"JBOSS_HOME"

It does not require you to have such an environment variable, but you do need a JAVA_HOME, but you already have that too, otherwise you wouldn't have the app server started.

Your problem is the lookup string you are using. You are getting using the className, which isn't how JBoss binds it in the JNDI tree.

I don't recall off the top of my head what that string is, something I try not to clog my brain with. Jaikiran will know it for sure.

Mark


Perfect World Programming, LLC - Two Laptop Bag - Tube Organizer
How to Ask Questions the Smart Way FAQ
Jaikiran Pai
Marshal

Joined: Jul 20, 2005
Posts: 10202
    
166

I don't recall off the top of my head what that string is, something I try not to clog my brain with. Jaikiran will know it for sure.



For EJB3, by default, the jndi name is a based on the combination of ApplicationName/BeanImplementationClassName/local or ApplicationName/BeanImplementationClassName/remote.

For example, if the application is MyApp and the bean implementation class is org.myapp.ejb.SimpleSession and if you are doing a lookup of remote interface then the default jndi name would be MyApp/SimpleSession/remote
Nikhil Jain
Ranch Hand

Joined: May 15, 2005
Posts: 385
I get the following error when I changed the JNDI name

javax.naming.NameNotFoundException: Remote not bound
at org.jnp.server.NamingServer.getBinding(NamingServer.java:529)
at org.jnp.server.NamingServer.getBinding(NamingServer.java:537)
at org.jnp.server.NamingServer.getObject(NamingServer.java:543)
at org.jnp.server.NamingServer.lookup(NamingServer.java:296)
at org.jnp.server.NamingServer.lookup(NamingServer.java:270)
at org.jnp.server.NamingServer.lookup(NamingServer.java:270)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source)
at sun.rmi.transport.Transport$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(Unknown Source)
at sun.rmi.transport.StreamRemoteCall.executeCall(Unknown Source)
at sun.rmi.server.UnicastRef.invoke(Unknown Source)
at org.jnp.server.NamingServer_Stub.lookup(Unknown Source)
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:625)
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:587)
at javax.naming.InitialContext.lookup(Unknown Source)
at com.webage.client.TestClient.runTest(TestClient.java:17)
at com.webage.client.TestClient.main(TestClient.java:25)
Nikhil Jain
Ranch Hand

Joined: May 15, 2005
Posts: 385
I am again iterating the steps which I have done to create ejb

1. I created a package com.webage.ejbs
i. Created an Interface

package com.webage.ejbs;
import javax.ejb.*;

@Remote
public interface SimpleBean {
public String sayHello(String name);
}


ii. Create the class for implementing the interface


package com.webage.ejbs;

import javax.ejb.Stateless;

@Stateless
public class SimpleBeanImpl implements SimpleBean {
public String sayHello(String name) {
return "Hello " + name + "!";
}
}


2. I Packed the above class in beans.jar

3. I created a folder and copied the beans.jar in it.

4. I also created a META-INF Folder & copied a application.xml

<?xml version="1.0" encoding="UTF-8"?>
<application xmlns="http://java.sun.com/xml/ns/j2ee" version="1.4"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com /xml/ns/j2ee [url=http://java.sun.com/xml/ns/j2ee/application_1_4.xsd">]http://java.sun.com/xml/ns/j2ee/application_1_4.xsd">[/url]
<display-name>Simple</display-name>
<description>Simple EJB3</description>

<module>
<ejb>beans.jar</ejb>
</module>

</application>

5. I named the folder as firstebj3.ear

6. Final Folder Structure
firstebj3.ear
META-INF
application.xml
manifest.mf
beans.jar


7. I copied the firstebj3.ear in <JSOSS_HOME>\server\default\deploy folder

8. I started the server.

9. Following is the snap shot of http://localhost:8080/jmx-console

Searched For: jboss.j2ee
ear=firstebj3.ear,jar=beans.jar,name=SimpleBeanImpl,service=EJB3
module=beans.jar,service=EJB3
service=ClientDeployer
service=EARDeployer
service=EARDeployment,url='firstebj3.ear'
service=EARDeployment,url='jbossejb30.ear'

10. I am trying to call the above ejb from local client

package com.webage.client;

import java.util.Properties;

import javax.naming.*;
import com.webage.ejbs.SimpleBean;

public class TestClient {

public void runTest() throws Exception {
Properties props = new Properties();
props.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
props.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming rg.jnp.interfaces");
props.setProperty("java.naming.provider.url", "jnp://127.0.0.1:1099");

InitialContext ctx = new InitialContext(props);
SimpleBean bean = (SimpleBean) ctx.lookup("firstebj3/SimpleBeanImpl/Remote");
String result = bean.sayHello("Billy Bob");
System.out.println(result);
}

public static void main(String[] args) {
try {
TestClient cli = new TestClient();
cli.runTest();

} catch (Exception e) {
e.printStackTrace();
}
}
}


WHAT AM I MISSING?



PLEASE HELP!!!
Nikhil Jain
Ranch Hand

Joined: May 15, 2005
Posts: 385
I changed the JNDI lookup name to firstebj3/SimpleBeanImpl

I got this name from jmx console.!!

I guess now the client is able to do the look up. Now I get error saying that..

java.lang.ClassCastException: org.jnp.interfaces.NamingContext
at com.webage.client.TestClient.runTest(TestClient.java:21)
at com.webage.client.TestClient.main(TestClient.java:29)

Any suggestions!!
Jaikiran Pai
Marshal

Joined: Jul 20, 2005
Posts: 10202
    
166

I guess, you are still using the wrong jndi name for the lookup. You mentioned, you used firstebj3/SimpleBeanImpl/Remote to do the lookup. Change it to:



Note, the lowercase 'r' in Remote. Give it a try.
vinay kumar gundu
Greenhorn

Joined: Mar 26, 2007
Posts: 5
Give jndi name like this

code:

ctx.lookup("SimpleBeanImpl/remote");

it will work fine...
Nikhil Jain
Ranch Hand

Joined: May 15, 2005
Posts: 385
Yups...it worked with ctx.lookup("firstebj3/SimpleBeanImpl/remote");


thanks...
Hemkiran Gadey
Greenhorn

Joined: Aug 29, 2005
Posts: 2
Shashank,

Could you post the contents of your ejb-jar.xml?

thanks
Nikhil Jain
Ranch Hand

Joined: May 15, 2005
Posts: 385
Hi,

There is no ejbjar.xml. ejb-jar.xml is not mandatory with Ejb3.0
 
With a little knowledge, a cast iron skillet is non-stick and lasts a lifetime.
 
subject: Running EJB 3.0 Session Bean in JBoss