dev@jsr311.java.net

Re: JSR311: JAX-RS and EJB

From: Marc Hadley <Marc.Hadley_at_Sun.COM>
Date: Mon, 01 Dec 2008 11:52:56 -0500

On Nov 27, 2008, at 3:39 AM, Stephan Koops wrote:
>
> 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 ...
> }
>
Yes, that is already covered in the currently non-normative section on
Java EE containers (section 6.2).

The proposal here is specifically about how to expose an EJB directly.

Marc.

>
> 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.
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe_at_jsr311.dev.java.net
> For additional commands, e-mail: dev-help_at_jsr311.dev.java.net
>

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