对于POST请求,Spring MVC Servlet被命中两次

时间:2014-06-02 14:23:55

标签: rest tomcat spring-mvc servlets

在使用Spring MVC为我的Web应用程序实现RESTful服务时,我遇到了一个奇怪的问题。在执行GET请求时,一切似乎都可以正常工作,但是,在执行POST请求时我正在处理的行为让我感到困惑。好吧,我已经实现了这个非常基本的控制器代码:

@Controller
@RequestMapping("/services")
public class RestService {

    @RequestMapping(value = "/test/post", method = RequestMethod.POST)
    public void postTest(@RequestBody String postString)
            throws PersistenceException {
        System.out.println(postString);
    }

}

当我使用Curl执行针对它的POST请求时:

curl --data "Hello world" http://localhost:8080/SpringMVC-REST/services/test/post

首次正确到达我的Controller并显示字符串。但是,不知道为什么,之后再次调用Spring MVC servlet ,在这种情况下,网址请求错误。该框架显然没有找到匹配的服务案例:

  

2014年6月2日下午4:06:21 org.springframework.web.servlet.DispatcherServlet noHandlerFound   警告:在名为“mvc-dispatcher”的DispatcherServlet中找不到具有URI [/ SpringMVC-REST / services / test / services / test / post]的HTTP请求的映射

对于第一种和第二种情况,调试器的堆栈似乎略有不同:

First case

Second case

似乎Spring MVC框架第二次尝试呈现输出,即使我对它不感兴趣,因为我没有通过Web UI访问它。我使用的servlet配置是标准配置:

<web-app id="WebApp_ID" version="2.4"
    xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <display-name>Spring MVC REST</display-name>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <servlet>
        <servlet-name>mvc-dispatcher</servlet-name>
        <servlet-class>
                    org.springframework.web.servlet.DispatcherServlet
                </servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>mvc-dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

Tomcat 6和7以及spring-web 3.2.8.RELEASE在我身上发生了这种情况。谁能在这里看到问题?

1 个答案:

答案 0 :(得分:1)

在方法返回类型之前使用@ResponseBody ..它应该可以解决您的问题。

所以它应该像

@Controller
@RequestMapping("/services")
public class RestService {

    @RequestMapping(value = "/test/post", method = RequestMethod.POST)
    public @ResponseBody void postTest(@RequestBody String postString)
            throws PersistenceException {
        System.out.println(postString);
    }

}