users@jersey.java.net

[Jersey] Re: URI to Resource mapping

From: Franck Mangin <franck102_at_yahoo.com>
Date: Fri, 24 Aug 2012 10:05:26 -0700 (PDT)

Hi Marek,

Thanks for your reply. I am trying things out, but since I am starting from scratch it is sometimes hard to tell if issues come from unsupported features or from something I overlooked or messed up.

I managed to have injection working fine on subresources (with even a custom Injectable of my own :) ), but I still can't figure out how to navigate from URI to resource (without reimplementing the logic that is already in my locator annotations):

ResourceContext.matchResource(".../bookstore/sections/adventure") returns a SectionResource, but the sectionId has not been injected (it should be "adventure"). My Section constructor looks like this:

public SectionResource(@PathParam("sectionId") String id)     {    _id = id;  }

... even though that injection works fine in my resource locator:

@Path("sections/{sectionId}")
    public SectionResource locateSection(@Context ResourceContext resourceContext)
    {
        return resourceContext.getResource(SectionResource.class);
    }

Am I missing something? I tried an injectable field instead of the constructor param and I get the same problem.

Thanks!
Franck





________________________________
 From: Marek Potociar <marek.potociar_at_oracle.com>
To: users_at_jersey.java.net
Sent: Wednesday, August 22, 2012 12:13 PM
Subject: [Jersey] Re: URI to Resource mapping
 



On Aug 17, 2012, at 4:37 PM, franck102_at_yahoo.com wrote:

Hi,
>
>I am new to Jersey, and struggling to come up with the correct design
>patterns for my resource hierarchy, especially w.r.t subresources,
>injection and URIs.
>
>I have a fairly simple multi-level hierarchy, let's say bookstore -
>sections - books and unique IDs for sections & books:
>/bookstore/sections/adventure
>/bookstore/sections/adventure/books/some-book-id
>
>I have three specific questions:
>
>1. I have a sections resource locator in the bookstore resource with an
>"sectionID" path param. I have found various versions on the web of the
>proper code to instantiate the subresource so that it can benefit from
>injection; including a post mentioning having to use a Scope of
>"prototype" if more then one subresource is to be instantiated in the
>request. Most of the posts are pretty old, so I am unclear as to
>whether they are still valid? Is this pattern the recommended approach:
>
>@Path("sections/{sectionId}")
>public SectionResource getSection(@PathParam("sectionId") String
>sectionId)
>{
>SectionResource res =  
>    
>_resourceContext.getResource(SectionResource.class);
>res.setId(sectionId);
>return res;
>}
>Is there any way to have the sectionId injected (to avoid the setId
>call)?
>

Yes, the story is still valid - you should use an injectable ResourceContext instance to get an instantiated and fully injected resource instance. This means that you may use the @PathParam directly in your SectionResource to inject the "sectionId" value:

@Path("bookstore")
public class BookStore {
    @Path("sections/{sectionId}")
    public SectionResource getSectionResource(@Context ResourceContext rc) {
        return rc.getResource(SectionResource.class);
    }
}

public class SectionResource {
    @GET
    public get(@PathParam("sectionId") sectionId) { ... }
}

I can't find any documentation about a prototype scope, what is the
>story there?
>
I'm not sure I understand what you mean.



>2. When processing a PUT of a property on a book (e.g. genre) I need to
>access the book's section model. Would
>ResourceContext.matchResource(".../bookstore/sections/adventure")
>return a SectionResource properly initialized for "adventure"? i.e.
>will it call my locator and set the sectionId?
>Knowing that the book is a subresource of its section, is there a
>better way to access the parent resource (other than an explicit
>setSection in the book's locator)?
>

Yes. ...why don't you just try it out? :)


>3. Each book holds a URI to an author resource that lives under
>/bookstore/authors/some-author.
>When receiving a PUT request to update the author of a book, can I use
>ResourceContext.matchResource(<supplied author URI>) to validate that
>the author exists?
>

Yes.

Marek


>Any help will be greatly appreciated!
>Thanks
>