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