struts-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Jeromy Evans <>
Subject Re: REST plugin URL syntax
Date Wed, 02 Jul 2008 13:27:11 GMT
Mike Watson wrote:
> Hi Jeromy,
> I've finally found time to try to resolve this but haven't had much luck.
> Just to recap, I'm looking to be able to do something similar to the following:
> /book -> returns a list of books
> /book/123 -> returns book with id 123
> /book/123/chapter/1 -> return chapter with id 1, retrieved from book
> 123 (this is a simplistic example, all resources have a unique ID)
> I'd also like to be able to control access based on the
> context/namespace used to access a resource e.g.:
> /logo/abc -> read or update
> /book/123/logo/abc -> read only
> (would I need multiple LogoControllers for this?)
> Using Namespaces as described by Jeromy below certainly seems to make
> sense but as soon as I start to try the example provided I lose the
> ability to GET /book/123, and I've tried with BookController having
> namespace of "/" or "/book" and neither works. And so far I haven't
> been able to successfully hit the ChapterController using a url like
> /book/123/chapter.
> Am I missing something really obvious? Is there something I need to
> put in the struts.xml to configure the namespaces as well as using the
> @Namespace annotation?
> Jeromy, you seem to be pretty knowledgeable about this - can you think
> of anything I might be doing wrong?
> Thanks in advance for your help.
> Mike

Hi Mike, I'll throw a quick answer together now and try to give you a 
more in-depth one in a day or two by building an example. 

The steps are:
 1. ensure struts is up-to-date. (2.1.3-SNAPSHOT preferably, to ensure 
you have the latest ActionMappingParamsInterceptor)
 2. enable the NamedVariablePatternMatcher via struts.xml 
 3. Create the BookController in the root namespace.  GET /book/123 will 
invoke with id=123
 4. Create the ChapterController in the namespace containing the book id 
variable (/book/{bookid}). GET /book/123/chapter will invoke 
ChapterContoller.index() with bookId=123.

public class BookController implements ModelDriven<Book> {  }

public class ChapterController implements ModelDriven<Chapter> {  }

Now that's what *should* happen.  I use it in a large application that 
includes many other related tweaks so I'll throw together a vanilla 
sample and post it somewhere.

I'll come back to the authorization issue separately.  The quick answer 
is that you can omit methods that are never permitted and/or filter URLs 
based on a URI pattern and/or user's role. 

Jeromy Evans

To unsubscribe, e-mail:
For additional commands, e-mail:

View raw message