We don't have support for multiple applications yet. We discussed it as a "nice to have" feature and didn't dive into the details yet. I think the main idea was to be able to load multiple applications, but to try resolving paths conflicts. Anyway it's just an idea, we can continue discussing it, but anyway I don't think we'll want it for 0.1
If I understand your use-case correctly, you can use the Wink with multiple servlets using the symphony.requestProcessorAttribute parameter. I think using this parameter for testing is ok and we don't need to develop anything to generate it. The servlet-mapping will resolve possible paths conflicts. What do you think? On Thu, Jul 2, 2009 at 11:22 PM, Bryant Luk <[email protected]> wrote: > Thanks, I think I understand the reasoning and the implementation > better between Eli and your messages. Let me think about this for a > bit. > > For the basic improvement that Eli suggested where multiple JAX-RS > Applications are allowed via a ; or something else, is the assumption > that you could find a common url pattern and make the @Path values be > "right"? For instance, if I had a bookstore application and a > shoestore application with (context root)/bookstore/item1 and (context > root)/shoestore/item1 as two intended URLs, you would have the URL > pattern be /* and all bookstore resources pre-pended with > @Path("/bookstore/{item}") and shoestore resources pre-pended with > @Path("/shoestore/{item}") (and also hope that there aren't > "undefined" scenarios where 2 paths are unknowingly exactly the same)? > An unlikely example but just making sure I understand the suggestion > and the implications. > > In any case, yes, I would hope the normal situation would be only one > RestServlet per war. I was trying to isolate some of the JAX-RS > Applications because I don't want some of the @Providers to cross > Applications. Originally the tests were written in numerous small > applications but in order to limit the number of Maven submodules, I > wanted to combine the applications together without the @Providers > crossing over. > > As far as the shared library point, I think both Eli and Michael have > answered my question. > > On Thu, Jul 2, 2009 at 12:56 PM, Michael Elman<[email protected]> wrote: > > Hi Bryant , > > > > this parameter is used in order to provide an additional functionality, > like > > Administration Servlet and a runtime registration. > > The reason is simple: we want be able to access the RequestProcessor > > instance from sources that are different that the RestServlet: other > > servlets, JMX, spring beans and so on. > > Of cause if this functionality is not required, we can use an > autogenerated > > value. > > > > > > > > > On Thu, Jul 2, 2009 at 4:51 PM, Bryant Luk <[email protected]> wrote: > > > >> Hi Eli, > >> > >> Just curious why we need the application developer to add that > >> parameter. Is there any way that we can autogenerate that parameter > >> within the runtime? The reasons why I think we should autogenerate: > >> > >> 1) Application portability. If other implementations take their > >> JAX-RS application and switch to Wink (or start with Wink), the first > >> impression may be that we don't work out of the box. > > > > > > The parameter is needed only if there are multiple RestServlet instances > > within the same war. I believe that a normal situation is to have a > single > > RestServlet per war. If this is the case, such a parameter is not needed. > So > > it won't work out of the box only in a complex cases. > > > > > >> > >> 2) I haven't tested this but if we use Wink as a shared library > >> across a container's applications (such as Geronimo/WebSphere), I > >> think this would cause some administration headaches since every > >> parameter value (I'm assuming) has to be unique. Some application > >> developers might not communicate their unique attribute names, and > >> this would be a really hard thing to find out when an application > >> doesn't work correctly. > >> > > > > What do you mean by using Wink as a shared library? If you mean sharing > it > > between wars (putting it in a parent classloader), it won't cause any > > problems, since the parameter should be unique per ServletConfig, meaning > it > > should be unique in the same war, but different wars can use the same > name. > > > > > >> > >> I think we can have it as an optional attribute if you want to use the > >> same RequestProcessor across two servlet instances, just that by > >> default, we generate a unique one per servlet instance. > >> > >> Thoughts? > >> > >> On Thu, Jul 2, 2009 at 3:34 AM, Baram, Eliezer<[email protected]> wrote: > >> > Hi Bryant > >> > The RestServlet stores the requestProcessor on the servletContext, by > >> default it saves it under an attribute named > >> RequestProcessor.class.getName() > >> > > >> > If you register more then one servlet and you want each to have a > >> separate RequestProcessor you need to indicate the RestServlet to save > the > >> RequestProcessor under a different attribute. > >> > > >> > You can specify the attribute name by setting the > >> "symphony.requestProcessorAttribute" init parameter of the RestServlet. > >> > See modification below. > >> > > >> > --Eli > >> > > >> > > >> > > >> > -----Original Message----- > >> > From: Bryant Luk [mailto:[email protected]] > >> > Sent: Thursday, July 02, 2009 2:09 AM > >> > To: [email protected] > >> > Subject: Multiple RestServlets in single web application? > >> > > >> > Hi, > >> > > >> > Does the RestServlet support multiple servlet instances in the same > >> > web application? > >> > > >> > It seems that only the first servlet (in alphabetical order) is fired > >> > up correctly. If I have two instances of the servlet, say > >> > MessageBodyWriterExceptions and MessageBodyReaderExceptions, only > >> > MessageBodyReaderExceptions seems to work. If I then rename > >> > MessageBodyReaderExceptions to "Z" (or comment out the servlet > >> > definition), then my MessageBodyWriterExceptions servlet JAX-RS app > >> > works. > >> > > >> > My web.xml: > >> > > >> > <web-app> > >> > <display-name>Archetype Created Web Application</display-name> > >> > <servlet> > >> > <servlet-name>MessageBodyWriterExceptions</servlet-name> > >> > > >> > > <servlet-class>org.apache.wink.server.internal.servlet.RestServlet</servlet-class> > >> > <init-param> > >> > <param-name>javax.ws.rs.Application</param-name> > >> > > >> > > <param-value>org.apache.wink.jaxrs.test.providers.writerexceptions.Application</param-value> > >> > </init-param> > >> > <load-on-startup>1</load-on-startup> > >> > </servlet> > >> > <servlet> > >> > <servlet-name>MessageBodyReaderExceptions</servlet-name> > >> > > >> > > <servlet-class>org.apache.wink.server.internal.servlet.RestServlet</servlet-class> > >> > <init-param> > >> > <param-name>javax.ws.rs.Application</param-name> > >> > > >> > > <param-value>org.apache.wink.jaxrs.test.providers.readerexceptions.Application</param-value> > >> > </init-param> > >> > [E.B] <init-param> > >> > <param-name>symphony.requestProcessorAttribute</param-name> > >> > <param-value>requestProcessorAttribute_2</param-value> > >> > </init-param> > >> > <load-on-startup>1</load-on-startup> > >> > </servlet> > >> > <servlet-mapping> > >> > <servlet-name>MessageBodyWriterExceptions</servlet-name> > >> > <url-pattern>/writerexceptions/*</url-pattern> > >> > </servlet-mapping> > >> > <servlet-mapping> > >> > <servlet-name>MessageBodyReaderExceptions</servlet-name> > >> > <url-pattern>/readerexceptions/*</url-pattern> > >> > </servlet-mapping> > >> > </web-app> > >> > > >> > -- > >> > > >> > - Bryant Luk > >> > > >> > >> > >> > >> -- > >> > >> - Bryant Luk > >> > > > > > > -- > > - Bryant Luk >
