Spring 3.0 REST实现DispatcherServlet找不到映射

时间:2009-06-03 19:38:58

标签: rest spring-mvc

我正在尝试使用简单的REST服务来使用Spring 3.0,但仍然遇到阻塞错误:

在DispatcherServlet中找不到带有URI [/ travel / us / nyc / sfo / 20091010/1122 / true /]的HTTP请求的映射,名称为“dispatcher”*

但是,在日志文件中它还指出:

org.springframework.web.servlet.mvc.annotation.Def aultAnnotationHandlerMapping - 映射的URL路径[/ travel / us / {from} / {to} / {date} / {time} / {departure} /]到处理程序[experiment.SomeController@dd9f85] *

我读到这表示存在从URI到实验的映射.SomeController类作为处理程序。

我必须忽略其中一个配置文件中的一个简单错误,但在多次检查所有内容并进行了相当多的谷歌搜索后,我还没有找到解决方案。我已经开启了针对Spring类的日志记录,但这也没有揭示出这个问题。

以下是相关的配置文件和一些代码片段,任何帮助都是预先指定的。 webapp部署到Glassfish v2.1,我在OS X上的JDK1.5上使用了Spring 3.0.0的M3版本。

目标是让getTripDetails()返回tripdetails的XML版本。因此使用MarshallingView。

来自web.xml:

<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherSe rvlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>

来自dispatcher-servlet.xml:

<context:annotation-config />
<context:component-scan base-package="net.vermaas.reisadvies.server" />

<bean class="org.springframework.web.servlet.mvc.annotat ion.DefaultAnnotationHandlerMapping">
<property name="alwaysUseFullPath" value="true"/>
</bean>

<bean id="viewResolver" class="org.springframework.web.servlet.view.Conten tNegotiatingViewResolver">
<property name="mediaTypes">
<map>
<entry key="xml" value="application/xml"/>
</map>
</property>
<property name="viewResolvers">
<list>
<bean class="org.springframework.web.servlet.view.BeanNa meViewResolver"/>
<bean class="org.springframework.web.servlet.view.Intern alResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</list>
</property>
</bean>

<bean id="marshaller" class="org.springframework.oxm.xstream.XStreamMars haller">
</bean>

<bean id="content" class="org.springframework.web.servlet.view.xml.Ma rshallingView">
<property name="contentType" value="application/xml" />
<property name="marshaller" ref="marshaller"/>
</bean>

控制器类: @Controller public class SomeController {

static Logger logger = Logger.getLogger(SomeController.class);

public SomeController() { }

@RequestMapping(value="/travel/us/{from}/{to}/{date}/{time}/{departure}", method=RequestMethod.GET)

public ModelAndView getTripDetails(@PathVariable String from, @PathVariable String to, @PathVariable String date, @PathVariable String time, @PathVariable boolean departure, Model model) {

logger.debug("getTripDetails"); // not logged

// Do some stuff
TripDetails td = ...

ModelAndView mav = new ModelAndView();
mav.setViewName("content");
mav.addObject("tripDetails", td);

return mav;

}

}

logger.debug("getTripDetails"); // not logged // Do some stuff TripDetails td = ... ModelAndView mav = new ModelAndView(); mav.setViewName("content"); mav.addObject("tripDetails", td); return mav;

对什么是错的任何想法?或者指向使用Spring 3.0作为输出的REST服务的REST服务的工作示例的指针?

此致 格罗

2 个答案:

答案 0 :(得分:2)

我也遇到了同样的问题,它与Spring 3.0一起工作的方式是将url-pattern中的/ *替换为/

答案 1 :(得分:2)

你必须做这样的事情:

<servlet-mapping>
    <servlet-name>baseproj</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

否则你的css,js和图像将无法解决。我知道这很糟糕但必须要做。无论如何我用apache mod_jk掩盖了http://localhost:8080/myapp/rest部分,所以它无关紧要。