@RequestBody Submitted via Spring MVC JSON Jackson Processor

I read several similar issues, including: JQuery, Spring MVC @RequestBody and JSON - making JSON Request work with JQuery / Ajax with Spring to work together

The requirement is that the server will only accept application / json types. I am using Spring MVC controller. The code sends the response as JSON via @ResponseBody. I want to get information via @RequestBody in my Spring MVC controller. I am using JSP to send JSON to Spring MVC Controller. My code and Spring MVC can be seen below:

I am new to JSON and 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> 

When doing this, I get no output. In Chrome I get 404 No error was found, and in Tomcat I get the following error:

 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']] 

Is there something wrong with the 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>--> 

controller

 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; 

}}

On call / application / delete, I return JSON. Therefore, I know that my JacksonProcessor is configured correctly. The problem is @RequestBody.

Where am I going wrong?

If I remove the headers in the code below, I get 415 error.

 @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; } 

I'm almost close, but it will be helpful to me to help.

+8
json javascript jquery spring-mvc jsp
source share
1 answer

I tried to play a little with your code, but could not get the same error as you. I reworked the 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> 

I had a very simple method similar to yours:

 @RequestMapping(value = "save", method = RequestMethod.POST, headers = {"content-type=application/json"}) public @ResponseBody String save (@RequestBody User user) throws Exception { return "save-test"; } 

The My User class is as follows:

 public class User { private String userId; public User() { } public String getUserId () { return userId; } public void setUserId (String userId) { this.userId = userId; } } 

My spring configuration has been removed to contain:

 <context:component-scan base-package="com.web"/> <mvc:annotation-driven/> <context:annotation-config/> 

I am using spring version 3.1.1 and jquery 1.8.1 (the latter, I believe). I am not getting the same error as you, maybe you can try some of what I did and see if that helps.

+12
source share

All Articles