dev@jsr311.java.net

Re: JSR311: JAX-RS and EJB

From: Stephan Koops <Stephan.Koops_at_web.de>
Date: Thu, 27 Nov 2008 09:39:45 +0100

Hi,

are there already plans to define the injection of a EJB session bean
into a resource class, like in the servlet API? If you want to support
e.g. HTML interfaces with JAX-RS, than the JAX-RS resource should no be
the session bean, because the resource is a part of the view.

Example:

@Path("whatever")
public class EjbClientResource {
    @EJB
    SessionBean sb;

    ... resource methods using the session bean ...
}

best regards
   Stephan

Marc Hadley schrieb:
> 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.