Hi Paul, On Apr 8, 2009, at 10:18 AM, Paul Austin wrote:
> Jerome, > > Here is an implementation which extends SpringBeanRouter, it could > easily be integrated into the super class. Thanks for the suggestion. I've added something similar in SpringBeanRouter in trunk r4711, but I only added an attachments property (a la SpringRouter). Reasoning: I don't think that setAttachment makes sense as a bean property, since it is actually adding another attachment instead of replacing anything. Restlet's main Router class also has the concept of a default restlet. The semantics in Router are a bit different than what you have here (its default is the restlet that receives all requests that don't map to something else, not the top-level resource -- depending on the routing mode these might be different things), so I left it out. You should still be able to map the top-level route using the attachments property like so: <property name="attachments"> <map> <entry key=""><value>topLevelResource</value></entry> </map> </property> I haven't tried this, though, so if it doesn't work please let me know. (We can come up with a different property name if necessary.) Thanks again, Rhett > import java.util.Map; > import java.util.Map.Entry; > > import org.restlet.Finder; > import org.restlet.ext.spring.SpringBeanRouter; > import org.springframework.beans.BeansException; > import org.springframework.beans.factory.BeanFactory; > import org.springframework.beans.factory.BeanFactoryAware; > > public class SpringRouter extends SpringBeanRouter implements > BeanFactoryAware { > private BeanFactory beanFactory; > > public void setAttachment(String uriPattern, String beanName) { > Finder finder = createFinder(beanFactory, beanName); > attach(uriPattern, finder); > } > > public void setAttachments(Map<String, String> attachments) { > for (Entry<String, String> attachment : attachments.entrySet()) { > String uriPattern = attachment.getKey(); > String beanName = attachment.getValue(); > setAttachment(uriPattern, beanName); > > } > } > > public void setBeanFactory(BeanFactory beanFactory) throws > BeansException { > this.beanFactory = beanFactory; > } > > public void setDefaultAttachment(String beanName) { > String uriPattern = ""; > setAttachment(uriPattern, beanName); > } > } > > Paul > > > On Wed, Apr 8, 2009 at 4:12 AM, Jerome Louvel <jerome.lou...@noelios.com > > wrote: > Paul, > > The problem is that the URI without the trailing slash isn't > equivalent to the one with it. It's true that in many cases, people > assume it is equivalent but it doesn't have to. > > Also, relative URIs can be expressed in the same way if the ends > with a slash or not, leading to further routing issues. The only way > we found to clean that is to force the client to redirect itself to > the URI with a slash. However, it isn't something we should do > automatically. > > BTW, there is a related RFE: > > "Improve matching of directory URIs" > http://restlet.tigris.org/issues/show_bug.cgi?id=532 > > Best regards, > Jerome Louvel > -- > Restlet ~ Founder and Lead developer ~ http://www.restlet.org > Noelios Technologies ~ Co-founder ~ http://www.noelios.com > > > > De : Paul Austin [mailto:mail-li...@revolsys.com] > Envoyé : mardi 7 avril 2009 21:58 > À : discuss@restlet.tigris.org > Objet : Re: [1.1.3] Tomcat + RestletFrameworkServlet mapping > SpringBeanRouter to / > > Here is a class which fixes the issue. Probably a better solution > would be to change the Route class so that if the remainingPart is > "" it sets it to "/" before doing the regex matching. On a related > note is it possible to force exact matching so that say /apps would > be mapped but not /apps/xyz? > > public class RootSpringBeanRouter extends SpringBeanRouter { > @Override > public void handle(Request request, Response response) { > Reference resourceRef = request.getResourceRef(); > if (resourceRef.getRemainingPart().equals("")) { > resourceRef.addSegment(""); > } > super.handle(request, response); > } > } > > > On Tue, Apr 7, 2009 at 12:27 PM, Paul Austin <mail- > li...@revolsys.com> wrote: > In my project I am deploying an application as a war file. The root > of the web application /* is mapped to the RestletFrameworkServlet > so that all handling is performed by Restlet. > > <servlet> > <servlet-name>bpf</servlet-name> > <servlet- > class>com.noelios.restlet.ext.spring.RestletFrameworkServlet</ > servlet-class> > </servlet> > > <servlet-mapping> > <servlet-name>bpf</servlet-name> > <url-pattern>/*</url-pattern> > </servlet-mapping> > > The root restlet is a SpringBeanRouter and I have a mapping for / to > a resource as shown below. > > <bean id="root" class="org.restlet.ext.spring.SpringBeanRouter" /> > > <bean > name="/" > id="rootResource" > scope="prototype" > class="myResourceClass" > /> > > The war is deployed to /ws on my server. > > If I access /ws I get an Restlet status page error saying "The > server has not found anything matching the request URI" but if I > use /ws/ it works correctly. > > I tried mapping to "" to see if that would work and it gives the > same behaviour. > > Is it possible to modify the router so that the root resource does > not need the trailing slash? > > Cheers, > Paul > > ------------------------------------------------------ http://restlet.tigris.org/ds/viewMessage.do?dsForumId=4447&dsMessageId=1604122