Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [jersey-dev] Sharing/caching object in request scope

I have replaced usages of HttpServletRequest.set/getAttribute() with ContainerRequestContext.set/getProperty() and now it works as expected.

Can you confirm this is the right approach when injecting “expensive” objects?
If, say, the Factory has to do an HTTP request or some other expensive operation in order to construct the object, which may be injected multiple times within the scope of a single request.

On Wed, 22 Apr 2020 at 16.01, Martynas Jusevičius <martynas@xxxxxxxxxxxxx> wrote:
I cannot explain it. The injection was done like this in all 3 classes:

@Context HttpServletRequest httpServletRequest;

I've tried reproducing it using JerseyTest, but no luck... I'm getting
httpServletRequest as null instead.

On Wed, Apr 22, 2020 at 2:10 PM Jan Supol <jan.supol@xxxxxxxxxx> wrote:
>
> Hi,
>
> It's odd you have injected the
> org.glassfish.jersey.server.ContainerRequest, since it does not inherit
> from HttpServletRequest.
>
> --Jan
>
> On 20.04.2020 22:45, Martynas Jusevičius wrote:
> > Hi,
> >
> > I'm porting 1.19 code to 2.30.1 which stores objects as
> > HttpServletRequest attributes.
> >
> > This was done to improve performance - if injection providers were
> > called multiple times, we didn't want to do expensive processing
> > multiple times to get the injectable object. A request filter would
> > get the object, store it HttpServletRequest, and providers would
> > simply take it from the attribute:
> >
> > public class ApplicationFactory
> > {
> >      public Application provide()
> >      {
> >          return (Application)httpServletRequest.getAttribute(LAPP.Application.getURI());
> >      }
> > ...
> >
> > I wonder if there's a better approach?
> >
> > In any case, this kind of code does not seem to work anymore. So far
> > it seems that the request filters get injected one HttpServletRequest
> > instance while a factory gets a different one:
> > ApplicationFilter: org.glassfish.jersey.server.ContainerRequest@7a11342
> > AuthFilter: org.glassfish.jersey.server.ContainerRequest@7a11342
> > ApplicationFactory: org.apache.catalina.connector.RequestFacade@3515d98a
> >
> > ApplicationFilter sets Application object as a HttpServletRequest
> > attribute, ApplicationFactory is supposed to retrieve it and inject it
> > into AuthFilter.
> >
> > But if they don't share HttpServletRequest, they don't share the
> > attributes and our approach breaks down.
> >
> > Any suggestions? Thanks.
> >
> > Martynas
> > _______________________________________________
> > jersey-dev mailing list
> > jersey-dev@xxxxxxxxxxx
> > To unsubscribe from this list, visit https://www.eclipse.org/mailman/listinfo/jersey-dev
> _______________________________________________
> jersey-dev mailing list
> jersey-dev@xxxxxxxxxxx
> To unsubscribe from this list, visit https://www.eclipse.org/mailman/listinfo/jersey-dev

Back to the top