dev@jsr311.java.net

JAX-RS and EJB

From: Marc Hadley <Marc.Hadley_at_Sun.COM>
Date: Mon, 24 Nov 2008 11:36:08 -0500

Experts,

Its time to start discussing the work we want to do for the first
maintenance release of JAX-RS. For 1.1 we'll be concentrating on
alignment with EE 6 and fixing any bugs that may have come to light
since 1.0 was finalized.

One significant issue that we've only briefly touched on before is how
to combine JAX-RS and EJB in a portable way to expose an EJB directly
as a JAX-RS resource. There are a couple of technical issues that
prevent that today:

(i) Given an EJB class name there's no portable way to work out the
JNDI name to use to obtain an instance.
(ii) Given a JNDI name one can lookup an instance but, at least for
the no-interface variant, the JAX-RS annotations will not be present
on the returned proxy.

We discussed this with the EJB and EE spec leads and came up with the
following three potential solutions:

(1) Declare a dependency on a resource EJB somewhere. E.g.:

@EJB(name="OrdersResourceRef",
beanInterface=com.acme.OrdersResource.class)

is placed on the Application class. The JAX-RS runtime will use the
following lookup to obtain an instance:

OrdersResource o = (OrdersResource)
    new InitialContext().lookup("java:comp/env/OrdersResourceRef");

and will reflect on the com.acme.OrdersResource.class to determine the
JAX-RS annotations.

(2) Declare the JNDI name on the resource class. E.g.:

@Stateless
@Path("somepath")
@JNDIName("OrdersResourceRef")
public class OrdersResource { ... }

Assuming the name is added to the global namespace, the lookup to
obtain an instance is:

OrdersResource o = (OrdersResource)
    new InitialContext().lookup("java:global/OrdersResourceRef");

The JAX-RS runtime will reflect on the resource class as normal.

(3) Introduce a new java:module/... context that contains all
components in the current module. Given:

@Stateless
@Path("somepath")
public class OrdersResource { ... }

The JAX-RS runtime would use the following lookup to obtain an instance:

OrdersResource o = (OrdersResource)
    new InitialContext().lookup("java:module/OrdersResource");

and will reflect on the resource class as normal.

Thoughts, comments, preferences ?

Thanks,
Marc.

---
Marc Hadley <marc.hadley at sun.com>
CTO Office, Sun Microsystems.