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