8

我已经阅读了许多类似的问题,包括:JQuery、Spring MVC @RequestBody 和 JSON - 使其 与 JSON 请求与 JQuery/Ajax 和 Spring一起工作

要求是服务器只接受 application/json 类型。我正在使用 Spring MVC 控制器。代码通过@ResponseBody 将响应以 JSON 形式发回。我想通过我的 Spring MVC 控制器中的 @RequestBody 获取信息。我正在使用 JSP 将 JSON 发送到 Spring MVC 控制器。我的代码和 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> 

服务.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; 
} 

我几乎接近了,但我们将不胜感激。

4

1 回答 1

12

我试图用你的代码多玩一点,但是无法得到与你得到的相同的错误。我已经修改了 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(我相信是最新的)。我没有遇到与您相同的错误,因此也许您可以尝试我所做的一些事情,看看是否有帮助。

于 2012-09-18T13:56:00.623 回答