在使用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请求的映射
对于第一种和第二种情况,调试器的堆栈似乎略有不同:
似乎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在我身上发生了这种情况。谁能在这里看到问题?
答案 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);
}
}