| :index-group: Session Beans |
| :jbake-type: page |
| :jbake-status: status=published |
| = Simple Stateless with Descriptor |
| |
| This test is similar to simple-stateless, with two major differences. In |
| this case all the classes are regular POJOs without annotations. The |
| EJB-specific metadata is provided via an XML descriptor. The second |
| difference is the explicite use of Local and Remote interfaces. |
| |
| == CalculatorImpl |
| |
| [source,java] |
| ---- |
| package org.superbiz.calculator; |
| |
| /** |
| * This is an EJB 3 stateless session bean, configured using an EJB 3 |
| * deployment descriptor as opposed to using annotations. |
| * This EJB has 2 business interfaces: CalculatorRemote, a remote business |
| * interface, and CalculatorLocal, a local business interface |
| */ |
| public class CalculatorImpl implements CalculatorRemote, CalculatorLocal { |
| |
| public int sum(int add1, int add2) { |
| return add1 + add2; |
| } |
| |
| public int multiply(int mul1, int mul2) { |
| return mul1 * mul2; |
| } |
| } |
| ---- |
| |
| == CalculatorLocal |
| |
| [source,java] |
| ---- |
| package org.superbiz.calculator; |
| |
| /** |
| * This is an EJB 3 local business interface |
| * This interface is specified using the business-local tag in the deployment descriptor |
| */ |
| public interface CalculatorLocal { |
| |
| public int sum(int add1, int add2); |
| |
| public int multiply(int mul1, int mul2); |
| } |
| ---- |
| |
| == CalculatorRemote |
| |
| [source,java] |
| ---- |
| package org.superbiz.calculator; |
| |
| |
| /** |
| * This is an EJB 3 remote business interface |
| * This interface is specified using the business-local tag in the deployment descriptor |
| */ |
| public interface CalculatorRemote { |
| |
| public int sum(int add1, int add2); |
| |
| public int multiply(int mul1, int mul2); |
| } |
| ---- |
| |
| == ejb-jar.xml |
| |
| The XML descriptor defines the EJB class and both local and remote |
| interfaces. |
| |
| [source,xml] |
| ---- |
| <ejb-jar xmlns="http://java.sun.com/xml/ns/javaee" |
| xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
| xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd" |
| version="3.0"> |
| <enterprise-beans> |
| <session> |
| <ejb-name>CalculatorImpl</ejb-name> |
| <business-local>org.superbiz.calculator.CalculatorLocal</business-local> |
| <business-remote>org.superbiz.calculator.CalculatorRemote</business-remote> |
| <ejb-class>org.superbiz.calculator.CalculatorImpl</ejb-class> |
| <session-type>Stateless</session-type> |
| <transaction-type>Container</transaction-type> |
| </session> |
| </enterprise-beans> |
| </ejb-jar> |
| ---- |
| |
| == CalculatorTest |
| |
| Two tests obtain a Local and Remote interface to the bean instance. This |
| time an `InitialContext` object is directly created, as opposed to |
| getting the context from `EJBContainer`, as we did in the previous |
| example. |
| |
| [source,java] |
| ---- |
| package org.superbiz.calculator; |
| |
| import junit.framework.TestCase; |
| |
| import javax.naming.Context; |
| import javax.naming.InitialContext; |
| import java.util.Properties; |
| |
| public class CalculatorTest extends TestCase { |
| |
| private InitialContext initialContext; |
| |
| protected void setUp() throws Exception { |
| Properties properties = new Properties(); |
| properties.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.core.LocalInitialContextFactory"); |
| |
| initialContext = new InitialContext(properties); |
| } |
| |
| /** |
| * Lookup the Calculator bean via its remote home interface |
| * |
| * @throws Exception |
| */ |
| public void testCalculatorViaRemoteInterface() throws Exception { |
| Object object = initialContext.lookup("CalculatorImplRemote"); |
| |
| assertNotNull(object); |
| assertTrue(object instanceof CalculatorRemote); |
| CalculatorRemote calc = (CalculatorRemote) object; |
| assertEquals(10, calc.sum(4, 6)); |
| assertEquals(12, calc.multiply(3, 4)); |
| } |
| |
| /** |
| * Lookup the Calculator bean via its local home interface |
| * |
| * @throws Exception |
| */ |
| public void testCalculatorViaLocalInterface() throws Exception { |
| Object object = initialContext.lookup("CalculatorImplLocal"); |
| |
| assertNotNull(object); |
| assertTrue(object instanceof CalculatorLocal); |
| CalculatorLocal calc = (CalculatorLocal) object; |
| assertEquals(10, calc.sum(4, 6)); |
| assertEquals(12, calc.multiply(3, 4)); |
| } |
| } |
| ---- |
| |
| == Running |
| |
| [source,console] |
| ---- |
| ------------------------------------------------------- |
| T E S T S |
| ------------------------------------------------------- |
| Running org.superbiz.calculator.CalculatorTest |
| Apache OpenEJB 4.0.0-beta-1 build: 20111002-04:06 |
| http://tomee.apache.org/ |
| INFO - openejb.home = /Users/dblevins/examples/simple-stateless-with-descriptor |
| INFO - openejb.base = /Users/dblevins/examples/simple-stateless-with-descriptor |
| INFO - Configuring Service(id=Default Security Service, type=SecurityService, provider-id=Default Security Service) |
| INFO - Configuring Service(id=Default Transaction Manager, type=TransactionManager, provider-id=Default Transaction Manager) |
| INFO - Found EjbModule in classpath: /Users/dblevins/examples/simple-stateless-with-descriptor/target/classes |
| INFO - Beginning load: /Users/dblevins/examples/simple-stateless-with-descriptor/target/classes |
| INFO - Configuring enterprise application: /Users/dblevins/examples/simple-stateless-with-descriptor/classpath.ear |
| INFO - Configuring Service(id=Default Stateless Container, type=Container, provider-id=Default Stateless Container) |
| INFO - Auto-creating a container for bean CalculatorImpl: Container(type=STATELESS, id=Default Stateless Container) |
| INFO - Enterprise application "/Users/dblevins/examples/simple-stateless-with-descriptor/classpath.ear" loaded. |
| INFO - Assembling app: /Users/dblevins/examples/simple-stateless-with-descriptor/classpath.ear |
| INFO - Jndi(name=CalculatorImplLocal) --> Ejb(deployment-id=CalculatorImpl) |
| INFO - Jndi(name=global/classpath.ear/simple-stateless-with-descriptor/CalculatorImpl!org.superbiz.calculator.CalculatorLocal) --> Ejb(deployment-id=CalculatorImpl) |
| INFO - Jndi(name=CalculatorImplRemote) --> Ejb(deployment-id=CalculatorImpl) |
| INFO - Jndi(name=global/classpath.ear/simple-stateless-with-descriptor/CalculatorImpl!org.superbiz.calculator.CalculatorRemote) --> Ejb(deployment-id=CalculatorImpl) |
| INFO - Jndi(name=global/classpath.ear/simple-stateless-with-descriptor/CalculatorImpl) --> Ejb(deployment-id=CalculatorImpl) |
| INFO - Created Ejb(deployment-id=CalculatorImpl, ejb-name=CalculatorImpl, container=Default Stateless Container) |
| INFO - Started Ejb(deployment-id=CalculatorImpl, ejb-name=CalculatorImpl, container=Default Stateless Container) |
| INFO - Deployed Application(path=/Users/dblevins/examples/simple-stateless-with-descriptor/classpath.ear) |
| Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.475 sec |
| |
| Results : |
| |
| Tests run: 2, Failures: 0, Errors: 0, Skipped: 0 |
| ---- |