我已经阅读了许多类似的问题,包括:JQuery,Spring MVC@RequestBody和 JSON-使它与Spring的JQuery / Ajax一起使用JSON请求
要求是服务器仅接受应用程序/ json类型。我正在使用Spring MVC控制器。该代码通过@ResponseBody将响应作为JSON发送回。我想通过Spring MVC Controller中的@RequestBody获取信息。我正在使用JSP将JSON发送到Spring MVC Controller。我的代码和Spring MVC可以在下面看到:
我是JSON和Javascript的新手。
JSP-index.jsp
<%@page language="java" contentType="text/html"%> <html> <head> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> <script type="text/javascript"> $('#myForm').on('submit', function(e) { var frm = $("#myForm"); var dat = JSON.stringify(frm.serializeArray()); $.ajax({ type: 'POST', url: $('#myForm').attr('action'), data: dat, contentType: 'application/json', dataType: 'json', error: function() { alert('failure'); } success: function(hxr) { alert("Success: " + xhr); } }); ); }; </script> </head> <body> <h2>Application</h2> <form id="myForm" action="/application/save" method="POST" accept="application/json" onclick="i()"> <input type="text" name="userId" value="User"> <input type="submit" value="Submit"> </form> </body> </html>
运行此程序时,我没有任何输出。在Chrome中,我得到404 Not found错误,在Tomcat中,我得到以下错误:
org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver handleNoSuchRequestHandlingMethod WARNING: No matching handler method found for servlet request: path '/application/sa ve', method 'POST', parameters map['userId' -> array<String>['User']]
JSP部分有问题吗?
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app 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_5.xsd" version="2.5"> <display-name>WebApp</display-name> <context-param> <!-- Specifies the list of Spring Configuration files in comma separated format.--> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring/service.xml</param-value> </context-param> <listener> <!-- Loads your Configuration Files--> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet> <servlet-name>application</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>application</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
service.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:util="http://www.springframework.org/schema/util" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd"> <context:component-scan base-package="com.web"/> <mvc:annotation-driven/> <context:annotation-config/> <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/> <bean id="jacksonMessageChanger" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> <property name="supportedMediaTypes" value="application/json"/> </bean> <!-- <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="messageConverters"> <list> <ref bean="jacksonMessageChanger"/> </list> </property> </bean>--> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="messageConverters"> <util:list id="beanList"> <ref bean="jacksonMessageChanger"/> </util:list> </property> </bean> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean> <!-- <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> <property name="mediaTypes"> <map> <entry key="json" value="application/json"/> </map> </property> </bean>-->
控制者
package com.web; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RequestBody; import com.webchannel.domain.User; import com.webchannel.domain.UserResponse; @Controller @RequestMapping("/application/*") public class SaveController { @RequestMapping(value = "save", method = RequestMethod.POST, headers = {"content-type=application/json"}) public @ResponseBody UserResponse save(@RequestBody User user) throws Exception { UserResponse userResponse = new UserResponse(); System.out.println("UserId :" + " " + user.getUserId()); return userResponse; } @RequestMapping(value = "delete", method = RequestMethod.GET) public @ResponseBody UserResponse delete() { System.out.println("Delete"); UserResponse userResponse = new UserResponse(); userResponse.setSuccess(true); userResponse.setVersionNumber("1.0"); return userResponse;
}}
调用/ application / delete时,我返回JSON。所以我知道我的JacksonProcessor配置正确。问题出在@RequestBody中。
我要去哪里错了?
如果我在下面的代码中删除标题,则会出现415错误。
@RequestMapping(value = "save", method = RequestMethod.POST) public @ResponseBody UserResponse save(@RequestBody User user) throws Exception { UserResponse userResponse = new UserResponse(); System.out.println("UserId :" + " " + user.getUserId()); return userResponse; }
我快要接近了,但能得到帮助。
我尝试对您的代码进行更多操作,但是无法获得与您遇到的错误相同的错误。我重新制作了HTML:
<html> <head> <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js"></script> <script type="text/javascript"> $(function() { $('#myForm').submit(function() { var form = $( this ), url = form.attr('action'), userId = form.find('input[name="userId"]').val(), dat = JSON.stringify({ "userId" : userId }); $.ajax({ url : url, type : "POST", traditional : true, contentType : "application/json", dataType : "json", data : dat, success : function (response) { alert('success ' + response); }, error : function (response) { alert('error ' + response); }, }); return false; }); }); </script> </head> <body> <h2>Application</h2> <form id="myForm" action="application/save"> <input type="text" name="userId" value="User"> <input type="submit" value="Submit"> </form> </body> </html>
我有一个非常简单的方法,类似于您的方法:
@RequestMapping(value = "save", method = RequestMethod.POST, headers = {"content-type=application/json"}) public @ResponseBody String save (@RequestBody User user) throws Exception { return "save-test"; }
我的用户类如下所示:
public class User { private String userId; public User() { } public String getUserId () { return userId; } public void setUserId (String userId) { this.userId = userId; } }
我的spring配置被剥离为包含:
<context:component-scan base-package="com.web"/> <mvc:annotation-driven/> <context:annotation-config/>
我正在使用Spring 3.1.1和jquery 1.8.1(我相信是最新的)。我没有遇到与您相同的错误,因此也许您可以尝试一些我所做的事情,看看是否有帮助。