users@jersey.java.net

Re: [Jersey] Re: Why doesn't HttpRequestContext expose request attributes?

From: Paul Sandoz <Paul.Sandoz_at_Sun.COM>
Date: Fri, 06 Nov 2009 10:45:28 +0100

Hi,

Request-scoped properties are available on HttpContext. Such
properties are distinct from servlet request attributes and there no
attempt to keep the two in sync.

Here is one idea:

@Target({FIELD, PARAMETER, METHOD})
@Retention(RUNTIME)
@Documented
public @interface RequestAttribute {
     String name();
}


@Provider
public class RequestAttributeInjector implements
InjectableProvider<RequestAttribute, Type> {
    private final HttpContext c;

    private final HttpServletRequest r;

    public UserInjector(@Context HttpContext c, @Context
HttpServletRequest r) {
        this.c = c;
        this.r = r;
    }

    public ComponentScope getScope() {
        return ComponentScope.PerRequest;
    }

    public Injectable getInjectable(ComponentContext ic,
RequestAttribute a, final Type t) {
        final String name = a.name();

        return new Injectable() {
            public Object getValue() {
                Object o = c.getProperties().get(name);
                if (o == null) {
                  o = r.getAttribute(name);
                }
                if (o == null) {
                  // Throw exception or return null?
                }

                // TODO verify that o.getClass() is compatible with
Type t
                return o;
            }
        }
    }
}


@Path("foo")
public class MyResource {
   private final MyValue v;

   public MyResource(@RequestAttribute("foo") MyValue v) {
     this.v = v;
   }
}

Paul.

On Nov 6, 2009, at 4:20 AM, Moises Lejter wrote:

> I'm thinking you could write an InjectableProvider for MyCustomType,
> which has the HttpServletRequest injected, and which could inject
> your MyCustomType into any other of your classes via @Context ...
>
> Moises
>
> On Thu, Nov 5, 2009 at 6:48 PM, Joe Bradley
> <gjoelbradley_at_netscape.net> wrote:
> Moises,
>
> But that would require us to manually extract the request attribute
> in the resource method per below. We will need this attribute in
> every resource method in our app, so I'm trying to save from having
> to do that repetively.
>
> @Path("/foo")
> public class MyResource {
>
> @Context
> HttpServletRequest request;
>
> @GET
> @Path("/bar")
> public Bar getBar() {
>
> MyCustomType custom =
> request.getAttribute("MyCustomAttribute");
>
> return ...
> }
> }
>
> What we really want is:
>
> @Path("/foo")
> public class MyResource {
>
> @Context
> MyCustomType custom;
>
> @GET
> @Path("/bar")
> public Bar getBar() {
>
> // Use custom here...
>
> return ...
> }
> }
>
> Joe
>> Subject: Re: [Jersey] Why doesn't HttpRequestContext expose request
>> attributes?
>> From: Moises Lejter <moilejter_at_gmail.com>
>> Date: Thu, 5 Nov 2009 11:59:09 -0600
>> To: users_at_jersey.dev.java.net
>> To: users_at_jersey.dev.java.net
>>
>> Hi!
>>
>> I thought that HttpServletRequest was injectable via @Context ?
>> That would give you access to the request parameters ...
>>
>> Moises
>>
>> On Thu, Nov 5, 2009 at 11:04 AM, Joe Bradley <joe.bradley_at_sun.com>
>> wrote:
>> I want to inject a custom object type into resource classes using
>> @Context. The custom object would be instantiated in an servlet
>> filter upstream of Jersey and placed in a request attribute.
>>
>> I've seen an example of writing a Provider to extract the Locale
>> from the HttpRequestContext and was trying to do something similar
>> to extract our custom object. However since HttpRequestContext
>> doesn't expose the request attributes I don't see a way to make
>> this work.
>>
>> Are there any alternative approaches?
>>
>> Joe
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscribe_at_jersey.dev.java.net
>> For additional commands, e-mail: users-help_at_jersey.dev.java.net
>>
>>
>
>