Pages

Saturday, August 16, 2008

How to implement EJB 3.0 <env-entry/> in ejb-jar.xml

A topic which is mentioned in the EJB 3.0 Specification (JSR-220) is the ability to add environment entries in ejb-jar.xml file. What I found interesting is that I could not Google for a good example of how to implement it. As a result, I thought I would provide a good simple example.

The first item you should examine is the schema resources for Java EE. Specifically we want to examine the ejb-jar_3_0.xsd. This file contains all of the information we need to create and validate an ejb-jar.xml file.

First we create an ejb-jar.xml file in our EJB project. This file should contain the following information at a minimum:


1 <?xml version="1.0" encoding="UTF-8"?>
2 <ejb-jar
3 xmlns="http://java.sun.com/xml/ns/javaee"
4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
6 http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd"
7 version="3.0">
8 </ejb-jar>

From here we can add our beans and environment variables. I have created an example project which demonstrates how to use the environment variables. Here is my ejb-jar file:

1 <?xml version="1.0" encoding="UTF-8"?>
2 <ejb-jar
3 xmlns="http://java.sun.com/xml/ns/javaee"
4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
6 http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd"
7 version="3.0">
8 <enterprise-beans>
9 <session>
10 <ejb-name>EnvironmentalResourceInjectionExampleBean</ejb-name>
11 <env-entry>
12 <env-entry-name>s1</env-entry-name>
13 <env-entry-type>java.lang.String</env-entry-type>
14 <env-entry-value>Hello</env-entry-value>
15 </env-entry>
16 <env-entry>
17 <env-entry-name>s2</env-entry-name>
18 <env-entry-type>java.lang.String</env-entry-type>
19 <env-entry-value>EJB Resource Injection World!</env-entry-value>
20 </env-entry>
21 </session>
22 </enterprise-beans>
23 </ejb-jar>
In my example, I use a stateless session bean with @WebService annotation. This allows me to test it right in GlassFish. I also use the @Resource annotation to inject my environment entries. I have used the name attribute to give it a JNDI lookup value. This works for GlassFish. Other containers may use the mappedName attribute.

Here is my stateless session bean:

1 /*
2 *
3 * Blue Lotus Software, LLC
4 *
5 * $Id: EnvironmentalResourceInjectionExampleBean.java 100 2008-08-16 21:57:19Z jyeary $
6 *
7 * Copyright [2008] [John Yeary]
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 */
18 package com.bluelotussoftware.ee.examples;
19
20 import javax.annotation.Resource;
21 import javax.ejb.Stateless;
22 import javax.jws.WebMethod;
23 import javax.jws.WebService;
24
25 /**
26 *
27 * @author John Yeary
28 * @version 1.0
29 */
30 @Stateless
31 @WebService
32 public class EnvironmentalResourceInjectionExampleBean implements
33 EnvironmentalResourceInjectionExampleRemote,
34 EnvironmentalResourceInjectionExampleLocal {
35
36 @Resource(name = "s1")
37 String s1;
38 @Resource(name = "s2")
39 String s2;
40
41 public String printEnv() {
42 return s1 + " " + s2;
43 }
44
45 @WebMethod
46 public String printEnvironment() {
47 return printEnv();
48 }
49 }

When I deploy the application to GlassFish, I can use the Web Service Tester to validate that I get the injected values.




As we can see, the values s1 and s2 are sucessfully injected. The complete Netbeans 6.1 project and source can be found here.

5 comments :