@RequestBody打发Spring MVC的JSON杰克逊处理器(@RequestBody S

2019-07-31 16:28发布

I have read some many similiar problems inlcluding: JQuery, Spring MVC @RequestBody and JSON - making it work together JSON request with JQuery/Ajax with Spring

The requirement is that the server will only accept application/json types. I am using a Spring MVC Controller. The code sends a response back as JSON through @ResponseBody. I want to get information through the @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 running this I am not getting any output. In the Chrome I get 404 Not found error 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 something wrong here in the JSP part?

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; 

} }

When invoking /application/delete I get JSON returned. So I know my JacksonProcessor is configured correctly. The problem is in @RequestBody.

Where am I going wrong?

If I remove the headers in the code below I get a 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 am almost close but help would be appreciated.

Answer 1:

我试着周围多一点你的代码打不过无法为你越来越得到同样的错误。 我已经修改了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";
}

我的User类看起来是这样的:

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(最新的,我相信)。 我没有收到同样的错误,你这样或许你可以尝试一些我做了什么,并看看是否有帮助。



文章来源: @RequestBody Sent Through Spring MVC JSON Jackson Processor