Possible JNDI lookups within EJB container

12,673

Solution 1

I usually inject EJBs inside EJB container with @EJB annotation. So the JDNI look ups are done by the server at deploy time.

For example JBOSS deployment:

INFO [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor] (MSC service thread 1-2) JNDI bindings for session bean named TestBean in deployment unit subdeployment "MyEJB.jar" of deployment "MyProject.ear" are as follows:

java:global/MyProject/MyEJB/TestBean!my.project.TestBean
java:app/MyEJB/TestEJB!my.project.TestBean
java:module/TestEJB!my.project.TestBean
java:global/MyProject/MyEJB/TestEJB
java:app/MyEJB/TestBean
java:module/TestBean

Some are per EJB specification some are application server dependent.

If you have to make look ups from context I think the best way is to use java:global.

You can also find some additional info at: http://glassfish.java.net/javaee5/ejb/EJB_FAQ.html#POJOLocalEJB

Solution 2

jndi is a bit like a file system. You can refer to things using a relative path based on where you are in the tree (where you "cd"-ed to).

The injected session context is by default "positioned" on java:comp, so there you reference things that are available in java:comp, without the need to provide the "full path".

Note that java:comp itself is relative to a single EJB bean, or because of historical reasons to the entire Web module.

I'm not 100% sure what you mean with embedded environment, but if the code from which you are doing the JNDI lookup is not part of any of the predefined scopes (like java:module, java:app, etc) only java:global can be portably used.

Share:
12,673
Steven
Author by

Steven

/

Updated on June 04, 2022

Comments

  • Steven
    Steven almost 2 years

    I'm going through the EJB 3.1 spec and am trying to grasp the different possible ways a JNDI call can be made.

    You can do it using a SessionContext and an InitialContext (or a self-created context based on the Initial- or SessionContext). Based on which you use the syntax differs, but I can't seem to find the logic behind it.

    So my question is: when can I use what syntax to use JNDI calls within an EJB container environment?

    The rest of this question just serves as illustration of my point.

    For example, I believe this is always possible for a correctly injected sessioncontext or created initialcontext:

    ctx.lookup(java:global[/<app-name>]/<module-name>/<bean-name>[!<fully-qualified-interface-name>])
    ctx.lookup(java:comp/env ...)
    // special ones like these
    ctx.lookup("java:comp/UserTransaction");
    ctx.lookup("java:comp/ORB");
    

    Sometimes (only for session context?) this shorter version is possible:

    ctx.lookup(<bean-name>);
    

    What about in an embedded environment, can only global references be used?