Contents [hide]
Environment Used
- JDK 6 (Java SE 6)
- EJB 3.0 (stateless session bean)
- Eclipse Indigo IDE for Java EE Developers (3.7.1)
- JBoss Tools – Core 3.3.0 M5 for Eclipse Indigo (3.7.1)
- JBoss Application Server (AS) 5.1.0
Setting up development environment:
Read this page for installing and setting up the environment for developing and deploying EJB 3.0 Session bean on JBoss application server.
Project Description:
- We are going to create a simple EJB 3 HelloWorld stateless session bean project and a remote Java application client which will call/invoke the bean.
- This “HelloWorld” example explains how to develop, deploy and run EJB3 Session Bean (stateless and stateful) in JBoss application server.
- For testing this “HelloWorld” example we write a remote Java Application Client (main() method).
- For simplicity, the session bean and the client to access the session bean are created in the same project.
Creating New EJB Project
- Open Eclipse IDE and create a new EJB project which can be done in three ways,
- Right click on Project Explorer -> New -> EJB Project
- File menu -> New -> EJB Project
- Click on the down arrow on New icon on toolbar -> EJB Project
- Enter the project name as “HelloWorldSessionBean” and make sure the JBoss 5.1 Runtime has been selected with the EJB 3.0 Module version.
- Click Next -> Next -> and Finish.
- You will see an EJB project in the Project Explorer view.
Creating Session Bean and Bean Interface
- Right click on ejbModule -> New -> Session Bean (EJB 3.x)
- Enter the Java package name as com.ibytecode.businesslogic
- Enter the Class name as HelloWorldBean
- Select the State type as Stateless
- Check the Remote Business Interface and enter the name ascom.ibytecode.business.HelloWorld. The business interface will be created in different package (com.ibytecode.business)
- Click Finish
Coding Bean and the Interface
- Open Bean Interface and type the following code and save the file (Ctrl+s).
- Interface can be either @Remote or @Local. In this example we have used @Remote.
1
2
3
4
5
6
7
|
package
com.ibytecode.business;
import
javax.ejb.Remote;
@Remote
public
interface
HelloWorld {
public
String sayHello();
}
|
- Open Bean and type the following code and save the file.
- Bean type can either be @Stateful or @Stateless. In this example we have used @Stateless.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
package
com.ibytecode.businesslogic;
import
com.ibytecode.business.HelloWorld;
import
javax.ejb.Stateless;
@Stateless
public
class
HelloWorldBean
implements
HelloWorld {
public
HelloWorldBean() {
}
public
String sayHello() {
return
"Hello World !!!"
;
}
}
|
Now the Stateless Session Bean has been created. The next step is to deploy the bean on the server.
Deploying EJB project
- Now we need to deploy the stateless session bean “HelloWorldBean” on server.
- Deploying the project can be done in two ways,
- Right click on the EJB project -> Run As -> Run On Server. Select the existing “JBoss 5.1 Runtime Server” and click Finish.
- Right click on “JBoss 5.1 Runtime Server” available in Servers view -> Add and Remove… -> Select the EJB JAR file from the left pane and click Add-> and then Finish.
Start/Restart the Server
Right click on “JBoss 5.1 Runtime Server” from Servers view and click on Start if it has not yet been started.
If the project is deployed properly with global JNDI mapping then you will see the following message in the console.
Creating Client
- The next step is to write a remote Java client application (with main()) for accessing and invoking the EJBs deployed on the server
- Client uses JNDI to lookup for a proxy of your bean and invokes method on that proxy.
Creating JNDI InitialContext
Obtaining a Context using InitialContext
- All naming service operations are performed on some implementation of the javax.naming.Context interface. Therefore, the starting point of interacting with the naming service is to obtain a Context by providing the properties specific to the server implementation being used. In our case it is, JBoss Application Server.
- To create a javax.naming.InitialContext, we need to initialize it with properties from the environment. JNDI verifies each property’s value by merging the values from the following two sources,
- Using parameterized constructor of InitialContext which takes properties of supplied environment
- jndi.properties resource files found on the classpath.
NOTE:We will use constructor for initializing the InitialContext
For JBoss AS 5 we need to set following properties,
Context.INITIAL_CONTEXT_FACTORY = org.jnp.interfaces.NamingContextFactory
Context.URL_PKG_PREFIXES = org.jboss.naming:org.jnp.interfaces
Context.PROVIDER_URL = jnp://localhost:1099
The following utility class is used to create InitialContext for JBoss AS and can be reused in all applications. Otherwise the code written in this class should be repeated in all clients.
- Right click on ejbModule -> New -> Class
- Enter the package name as com.ibytecode.clientutility
- Enter the Class name as ClientUtility
- Click on Finish
01
02
03
04
05
06
07
08
09
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
|
package
com.ibytecode.clientutility;
import
java.util.Properties;
import
javax.naming.Context;
import
javax.naming.InitialContext;
import
javax.naming.NamingException;
public
class
ClientUtility {
/*location of JBoss JNDI Service provider the client will use.
It should be URL string.*/
/*specifying the list of package prefixes to use when
loading in URL context factories. colon separated*/
private
static
final
String JNP_INTERFACES =
"org.jboss.naming:org.jnp.interfaces"
;
/*Factory that creates initial context objects.
fully qualified class name. */
private
static
final
String INITIAL_CONTEXT_FACTORY =
"org.jnp.interfaces.NamingContextFactory"
;
private
static
Context initialContext;
public
static
Context getInitialContext()
throws
NamingException
{
if
(initialContext ==
null
) {
//Properties extends HashTable
Properties prop =
new
Properties();
prop.put(Context.INITIAL_CONTEXT_FACTORY, INITIAL_CONTEXT_FACTORY);
prop.put(Context.URL_PKG_PREFIXES, JNP_INTERFACES);
prop.put(Context.PROVIDER_URL, PROVIDER_URL);
initialContext =
new
InitialContext(prop);
}
return
initialContext;
}
}
|
Creating client class
- Right click on ejbModule -> New -> Class
- Enter the package name as com.ibytecode.client
- Enter the Class name as EJBApplicationClient
- Check the main() method option
- Click on Finish
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
package
com.ibytecode.client;
import
javax.naming.Context;
import
javax.naming.NamingException;
import
com.ibytecode.business.HelloWorld;
import
com.ibytecode.clientutility.ClientUtility;
public
class
EJBApplicationClient {
private
static
final
String LOOKUP_STRING =
"HelloWorldBean/remote"
;
public
static
void
main(String[] args) {
HelloWorld bean = doLookup();
System.out.println(bean.sayHello());
//3. Call business logic
}
private
static
HelloWorld doLookup(){
Context context =
null
;
HelloWorld bean =
null
;
try
{
//1. Obtaining Context
context = ClientUtility.getInitialContext();
//2. Lookup and cast
bean = (HelloWorld)context.lookup(LOOKUP_STRING);
}
catch
(NamingException e){
e.printStackTrace();
}
return
bean;
}
}
|
The figure below shows the final directory structure of this example.
Run the client
Use Ctrl + F11 to run the client.
Hello World !!!
How to create a simple EJB3 project in Eclipse (JBoss 5.1),Tags: ejb 3 in eclipse ide, ejb 3 on jboss as, ejb3, ejb3 client jndi lookup, ejb3 stateless session bean,helloworld ejb in eclipse, HelloWorld java program, jboss as, jboss in eclipse ide, jndi lookup client,stateless session bean jboss, step by step ejb3 development deployment in eclipse ide on jboss as
这个教程还是有一点问题需要注意一下的。就是一个接口函数,eclipse 会自动的生成一个接口类 helloworldbeanRemote.java 和helloworldbean 在一个package中
应该是应用了反射,这一点现在我还是不太清楚。