https://issues.apache.org/jira/browse/TOMEE-888

done ;)

*Romain Manni-Bucau*
*Twitter: @rmannibucau <https://twitter.com/rmannibucau>*
*Blog: **http://rmannibucau.wordpress.com/*<http://rmannibucau.wordpress.com/>
*LinkedIn: **http://fr.linkedin.com/in/rmannibucau*
*Github: https://github.com/rmannibucau*



2013/4/8 Romain Manni-Bucau <[email protected]>

> ok,
>
> the issue is the @Context resources are basically only available for rest
> endpoints ATM
>
> i'll dig to see if we can make it available to cdi beans without getting a
> big extra cost
>
> *Romain Manni-Bucau*
> *Twitter: @rmannibucau <https://twitter.com/rmannibucau>*
> *Blog: **http://rmannibucau.wordpress.com/*<http://rmannibucau.wordpress.com/>
> *LinkedIn: **http://fr.linkedin.com/in/rmannibucau*
> *Github: https://github.com/rmannibucau*
>
>
>
> 2013/4/8 Romain Manni-Bucau <[email protected]>
>
>> Think i know, can you try ServletRequest instead of httpservletrequest
>> please (ill get a computer in 1h to go further)
>> Le 8 avr. 2013 08:13, "Antoine Reilles" <[email protected]> a
>> écrit :
>>
>>  Sure, here is the war I used, with its sources.
>>> I tried to get the sample minimalist, so it almost only performs
>>> System.out traces.
>>>
>>> On Mon, Apr 8, 2013 at 7:58 AM, Romain Manni-Bucau <
>>> [email protected]> wrote:
>>>
>>>> Hi
>>>>
>>>> You seem to have a sample project, can you share it or the war
>>>> associated
>>>> please?
>>>> Le 8 avr. 2013 07:55, "Antoine Reilles" <[email protected]> a
>>>> écrit :
>>>>
>>>> > Hi,
>>>> >
>>>> > I'm running into issues when defining a RequestScoped CDI bean to be
>>>> > injected in a jax-rs service, and initialized with information from
>>>> the
>>>> > http request.
>>>> > My first problem is that the @Context HttpServletRequest that gets
>>>> injected
>>>> > in the CDI bean is invalid (the threadlocal proxy points to null, thus
>>>> > raising NPE when a method is called on the object) whenever the same
>>>> > @Context HttpServletRequest is not injected in the jax-rs context. If
>>>> the
>>>> > servletrequest in injected in the jax-rs endpoint, then it is properly
>>>> > available from the CDI bean.
>>>> > The second issue I have is that injecting the HttpServletResponse in
>>>> the
>>>> > CDI bean makes it available with the same limitations as the
>>>> > HttpServletRequest, but it is no more available (again, a thread local
>>>> > proxy pointing to null) in the @PreDestroy method of the CDI bean.
>>>> >
>>>> > Here are samples of what I used to test, I can provide a complete
>>>> sample if
>>>> > it is useful.
>>>> >
>>>> > The service is simply:
>>>> > @Path("service")
>>>> > @Produces(MediaType.TEXT_PLAIN)
>>>> > public class Service {
>>>> >   @Context HttpServletRequest request;
>>>> >   @Context HttpServletResponse response;
>>>> >   @Inject Ctx ctx;
>>>> >
>>>> >   @GET
>>>> >   public String foo() {
>>>> >     return "foo: "+ctx;
>>>> >   }
>>>> > }
>>>> >
>>>> > with the two @Context annotated fields triggering different behavior
>>>> in the
>>>> > CDI bean when commented out.
>>>> > The CDI bean itself is:
>>>> > @RequestScoped
>>>> > public class Ctx {
>>>> >
>>>> >   @Context HttpServletRequest request;
>>>> >   @Context HttpServletResponse response;
>>>> >   private String requesturi;
>>>> >   Ctx() {
>>>> >     requesturi = null;
>>>> >   }
>>>> >
>>>> >   @PostConstruct
>>>> >   public void postConstruct() {
>>>> >     ServletRequest localreq =
>>>> >
>>>> ((org.apache.openejb.rest.ThreadLocalHttpServletRequest)request).get();
>>>> >     if (null == localreq) {
>>>> >       System.out.println("null request injected");
>>>> >     } else {
>>>> >       requesturi = request.getRequestURI();
>>>> >     }
>>>> >     System.out.println("Ctx @PostConstruct:"+this);
>>>> >     ServletResponse localResp =
>>>> >
>>>> ((org.apache.openejb.rest.ThreadLocalHttpServletResponse)response).get();
>>>> >     if (null == localResp) {
>>>> >       System.out.println("null response injected");
>>>> >     } else {
>>>> >       System.out.println("Ctx @PostConstruct Response:
>>>> > "+response.getStatus());
>>>> >     }
>>>> >   }
>>>> >
>>>> >   @PreDestroy
>>>> >   public void preDestroy() {
>>>> >     System.out.println("Ctx @PreDestroy:"+this);
>>>> >     ServletResponse localResp =
>>>> >
>>>> ((org.apache.openejb.rest.ThreadLocalHttpServletResponse)response).get();
>>>> >     if (null == localResp) {
>>>> >       System.out.println("null response injected at preDestroy");
>>>> >     } else {
>>>> >       System.out.println("Ctx @PreDestroy Response:
>>>> > "+response.getStatus());
>>>> >     }
>>>> >   }
>>>> > }
>>>> >
>>>> > I had to resort to casts to ThreadLocalHttpServletRequest to test the
>>>> > injected proxies, since calling any method on a proxy pointing null
>>>> > triggers an NPE, to display traces.
>>>> > When the two @Context annotated fields are present in the Service
>>>> class, I
>>>> > do get traces like this:
>>>> > Ctx @PostConstruct:Ctx: service
>>>> > Ctx @PostConstruct Response: 200
>>>> > Ctx @PreDestroy:Ctx: service
>>>> > null response injected at preDestroy
>>>> >
>>>> > and when the two fields are commented out in the Service class, the
>>>> traces
>>>> > are:
>>>> > null request injected
>>>> > Ctx @PostConstruct:Ctx: null
>>>> > null response injected
>>>> > Ctx @PreDestroy:Ctx: null
>>>> > null response injected at preDestroy
>>>> >
>>>> >
>>>> > I tested this behavior with 1.5.1, 1.5.2 and todays 1.6.0 snapshot,
>>>> and got
>>>> > the very same behavior.
>>>> >
>>>> > Any suggestions on how I could make this work ?
>>>> >
>>>> > Best regards,
>>>> > antoine
>>>> >
>>>>
>>>
>>>
>

Reply via email to