Sorry , just noticed this was on the list twice.

I believe this change actually violates the JAX-RS 1.1 spec, see here:
http://jsr311.java.net/nonav/releases/1.1/spec/spec3.html#x3-520005

JAX-RS provides facilities for obtaining and processing information about
the application deployment context and the context of individual requests.
Such information is available to Application subclasses (see section
2.1<http://jsr311.java.net/nonav/releases/1.1/spec/spec3.html#x3-110002.1>),
root resource classes (see chapter
3<http://jsr311.java.net/nonav/releases/1.1/spec/spec3.html#x3-180003>),
and providers (see chapter
4<http://jsr311.java.net/nonav/releases/1.1/spec/spec3.html#x3-390004>).
This chapter describes these facilities.

CDI beans are none of those.

John


On Mon, Apr 8, 2013 at 3:48 AM, Romain Manni-Bucau <[email protected]>wrote:

> 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