= Lookup Of Ejbs with Descriptor
:jbake-date: 2016-09-06
:jbake-type: page
:jbake-tomeepdf:
:jbake-status: published

Example lookup-of-ejbs-with-descriptor can be browsed at https://github.com/apache/tomee/tree/master/examples/lookup-of-ejbs-with-descriptor


*Help us document this example! Click the blue pencil icon in the upper right to edit this page.*

==  BlueBean


[source,java]
----
package org.superbiz.ejblookup;

import javax.ejb.EJBException;
import javax.naming.InitialContext;
import javax.naming.NamingException;

//START SNIPPET: code
public class BlueBean implements Friend {

    public String sayHello() {
        return "Blue says, Hello!";
    }

    public String helloFromFriend() {
        try {
            Friend friend = (Friend) new InitialContext().lookup("java:comp/env/myFriend");
            return "My friend " + friend.sayHello();
        } catch (NamingException e) {
            throw new EJBException(e);
        }
    }
}
----


==  Friend


[source,java]
----
package org.superbiz.ejblookup;

/**
 * This is an EJB 3 local business interface
 * A local business interface may be annotated with the @Local
 * annotation, but it's optional. A business interface which is
 * not annotated with @Local or @Remote is assumed to be Local
 * if the bean does not implement any other interfaces
 */
//START SNIPPET: code
public interface Friend {

    public String sayHello();

    public String helloFromFriend();
}
----


==  RedBean


[source,java]
----
package org.superbiz.ejblookup;

import javax.ejb.EJBException;
import javax.naming.InitialContext;
import javax.naming.NamingException;

//START SNIPPET: code
public class RedBean implements Friend {

    public String sayHello() {
        return "Red says, Hello!";
    }

    public String helloFromFriend() {
        try {
            Friend friend = (Friend) new InitialContext().lookup("java:comp/env/myFriend");
            return "My friend " + friend.sayHello();
        } catch (NamingException e) {
            throw new EJBException(e);
        }
    }
}
----


==  ejb-jar.xml


[source,xml]
----
<ejb-jar xmlns="http://java.sun.com/xml/ns/javaee">

  <!-- Notice this changes the global jndi name -->
  <module-name>wombat</module-name>

  <enterprise-beans>

    <session>
      <ejb-name>BlueBean</ejb-name>
      <business-local>org.superbiz.ejblookup.Friend</business-local>
      <ejb-class>org.superbiz.ejblookup.BlueBean</ejb-class>
      <session-type>Stateless</session-type>
      <transaction-type>Container</transaction-type>
      <ejb-local-ref>
        <ejb-ref-name>myFriend</ejb-ref-name>
        <local>org.superbiz.ejblookup.Friend</local>
        <ejb-link>RedBean</ejb-link>
      </ejb-local-ref>
    </session>

    <session>
      <ejb-name>RedBean</ejb-name>
      <business-local>org.superbiz.ejblookup.Friend</business-local>
      <ejb-class>org.superbiz.ejblookup.RedBean</ejb-class>
      <session-type>Stateless</session-type>
      <transaction-type>Container</transaction-type>
      <ejb-local-ref>
        <ejb-ref-name>myFriend</ejb-ref-name>
        <local>org.superbiz.ejblookup.Friend</local>
        <ejb-link>BlueBean</ejb-link>
      </ejb-local-ref>
    </session>

  </enterprise-beans>
</ejb-jar>
----

    

==  EjbDependencyTest


[source,java]
----
package org.superbiz.ejblookup;

import junit.framework.TestCase;

import javax.ejb.embeddable.EJBContainer;
import javax.naming.Context;

//START SNIPPET: code
public class EjbDependencyTest extends TestCase {

    private Context context;

    protected void setUp() throws Exception {
        context = EJBContainer.createEJBContainer().getContext();
    }

    public void testRed() throws Exception {

        Friend red = (Friend) context.lookup("java:global/wombat/RedBean");

        assertNotNull(red);
        assertEquals("Red says, Hello!", red.sayHello());
        assertEquals("My friend Blue says, Hello!", red.helloFromFriend());
    }

    public void testBlue() throws Exception {

        Friend blue = (Friend) context.lookup("java:global/wombat/BlueBean");

        assertNotNull(blue);
        assertEquals("Blue says, Hello!", blue.sayHello());
        assertEquals("My friend Red says, Hello!", blue.helloFromFriend());
    }
}
----


=  Running

    

[source]
----
-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running org.superbiz.ejblookup.EjbDependencyTest
Apache OpenEJB 4.0.0-beta-1    build: 20111002-04:06
http://tomee.apache.org/
INFO - openejb.home = /Users/dblevins/examples/lookup-of-ejbs-with-descriptor
INFO - openejb.base = /Users/dblevins/examples/lookup-of-ejbs-with-descriptor
INFO - Using 'javax.ejb.embeddable.EJBContainer=true'
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/lookup-of-ejbs-with-descriptor/target/classes
INFO - Beginning load: /Users/dblevins/examples/lookup-of-ejbs-with-descriptor/target/classes
INFO - Configuring enterprise application: /Users/dblevins/examples/lookup-of-ejbs-with-descriptor
INFO - Configuring Service(id=Default Stateless Container, type=Container, provider-id=Default Stateless Container)
INFO - Auto-creating a container for bean BlueBean: Container(type=STATELESS, id=Default Stateless Container)
INFO - Configuring Service(id=Default Managed Container, type=Container, provider-id=Default Managed Container)
INFO - Auto-creating a container for bean org.superbiz.ejblookup.EjbDependencyTest: Container(type=MANAGED, id=Default Managed Container)
INFO - Enterprise application "/Users/dblevins/examples/lookup-of-ejbs-with-descriptor" loaded.
INFO - Assembling app: /Users/dblevins/examples/lookup-of-ejbs-with-descriptor
INFO - Jndi(name="java:global/wombat/BlueBean!org.superbiz.ejblookup.Friend")
INFO - Jndi(name="java:global/wombat/BlueBean")
INFO - Jndi(name="java:global/wombat/RedBean!org.superbiz.ejblookup.Friend")
INFO - Jndi(name="java:global/wombat/RedBean")
INFO - Jndi(name="java:global/EjbModule136565368/org.superbiz.ejblookup.EjbDependencyTest!org.superbiz.ejblookup.EjbDependencyTest")
INFO - Jndi(name="java:global/EjbModule136565368/org.superbiz.ejblookup.EjbDependencyTest")
INFO - Created Ejb(deployment-id=RedBean, ejb-name=RedBean, container=Default Stateless Container)
INFO - Created Ejb(deployment-id=BlueBean, ejb-name=BlueBean, container=Default Stateless Container)
INFO - Created Ejb(deployment-id=org.superbiz.ejblookup.EjbDependencyTest, ejb-name=org.superbiz.ejblookup.EjbDependencyTest, container=Default Managed Container)
INFO - Started Ejb(deployment-id=RedBean, ejb-name=RedBean, container=Default Stateless Container)
INFO - Started Ejb(deployment-id=BlueBean, ejb-name=BlueBean, container=Default Stateless Container)
INFO - Started Ejb(deployment-id=org.superbiz.ejblookup.EjbDependencyTest, ejb-name=org.superbiz.ejblookup.EjbDependencyTest, container=Default Managed Container)
INFO - Deployed Application(path=/Users/dblevins/examples/lookup-of-ejbs-with-descriptor)
INFO - EJBContainer already initialized.  Call ejbContainer.close() to allow reinitialization
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.679 sec

Results :

Tests run: 2, Failures: 0, Errors: 0, Skipped: 0
----

    
