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> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring/service.xml</param-value> </context-param> <listener> <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"> <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>
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.