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 >>>> > >>>> >>> >>> >
