java.io.EOFException杰克逊处理器

时间:2012-09-21 13:46:14

标签: java jquery jsp spring-mvc jackson

我正在使用带有Jackson处理器的Spring MVC。当JSON请求作为POST请求发送到服务器时,@ RequestBody被反序列化为我需要的对象。发送GET请求时出现问题,它实际显示Http 500 Internal Server错误。引发的异常是:

java.io.EOFException: No content to map to Object due to end of input 
org.codehaus.jackson.map.ObjectMapper._initForReading(ObjectMapper.java:2022) 
org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:1974) 
org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1331) 
org.springframework.http.converter.json.MappingJacksonHttpMessageConverter.readInternal  (MappingJacksonHttpMessageConverter.java:135) 
org.springframework.http.converter.AbstractHttpMessageConverter.read(AbstractHttpMessageConverter.java:154) 
org.springframework.web.bind.annotation.support.HandlerMethodInvoker.readWithMessageConverters(HandlerMethodInvoker.java:633) 
org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveRequestBody(HandlerMethodInvoker.java:597) 
 org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveHandlerArguments  (HandlerMethodInvoker.java:346) 
org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:171) 
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:426) 
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:414) 
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790) 
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719) 
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644) 
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 

不发送任何emtpy字符串,并将正确的JSON发送到服务器。我不确定为什么会这样。以下是我的代码:

JSP - index.jsp

<%@page language="java" contentType="text/html"%>
<html>
<head>
<script type="text/javascript" src="http://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 : "GET", 
        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/user/find" method="GET">
    <input type="text" name="userId" value="user1">
    <input type="submit" value="Submit">
</form>
      </body>
</html>

只要我在JSP和控制器方法中将请求类型更改为POST,一切似乎都能正常工作。

package com.web;

@Controller
@RequestMapping("/user/*")
public class UserController {

@RequestMapping(value = "find", method = RequestMethod.GET, 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;
}

的beans.xml

<context:component-scan base-package="com.web"/>

<mvc:annotation-driven/>

<context:annotation-config/>

User.java

public class User implements Serializable {

private String userId;

public User() {

}

// Getters and setters
}

当发送GET请求时,broswer通常会显示%% user %%。这只是一个例子。杰克逊处理器是否仍会读取GET请求?

我不知道问题出在哪里。我希望你能提供帮助。

1 个答案:

答案 0 :(得分:1)

我阅读了以下关于jQuey.ajax()在http://api.jquery.com/jQuery.ajax/处执行的数据参数的说明:

要发送到服务器的数据。如果不是字符串,它将转换为查询字符串。它附加到GET请求的URL。 ....

因此它被附加到URL并且没有请求正文。这是一种与GET语义一致的行为,如果你想使用POST发布数据。