2010-09-23 97 views
-12

末我有看起来像这样的一个REST Web服务的响应: -为什么JSON ObjectMapper扔java.io.EOFException的:没有内容映射到对象因输入

{ 
    "number":447919191231, 
    "messages":"", 
    "receipt":{ 
     "uid":"5d1bddf5-1b98-4a32-8ebf-f71c3973e7a8", 
     "messages":"", 
     "status":"SUCCESS", 
     "code":"09641", 
     "ttl":120, 
     "url":"http:\/\/server:8080\/x\/d6985" 
    } 
} 

和我尝试使用

http://wiki.fasterxml.com/JacksonInFiveMinutes#Full_Data_Binding_.28POJO.29_Example

我创建了一个类,它看起来像这样完整数据这里列出的方法绑定例如: -

public class ReceiptResponse { 

    private int _number; 
    private String _messages; 
    private Receipt _receipt; 

    public int getNumber() { return _number; } 
    public void setNumber(int number) { this._number = number; } 
    public String getMessages() { return _messages; } 
    public void setMessages(String messages) { this._messages = messages; } 
    public Receipt getReceipt() { return _receipt; } 
    public void setReceipt(Receipt receipt) { this._receipt = receipt; } 

public static class Receipt { 
     private String _uid; 
     private String _messages; 
     private String _status; 
     private int _code; 
     private int _ttl; 
     private String _url; 

     public String getUid() { return _uid; } 
     public void setUid(String uid) { this._uid = uid; } 
     public String getMessages() { return _messages; } 
     public void setMessages(String messages) { this._messages = messages; } 
     public String getStatus() { return _status; } 
     public void setStatus(String status) { this._status = status;} 
     public int getCode() { return _code; } 
     public void setCode(int code) { this._code = code; } 
     public int getTtl() { return _ttl; } 
     public void setTtl(int ttl) { this._ttl = ttl; } 
     public String getUrl() { return _url; } 
     public void setUrl(String url) { this._url = url; } 
    } 
} 

我的代码来解析这种反应是这样的: -

ObjectMapper mapper = new ObjectMapper(); 
ReceiptResponse response = mapper.readValue(method.getResponseBodyAsStream(), ReceiptResponse.class); 

但它引发以下错误: -

12:03:44,195 ERROR [STDERR] Fatal transport error: No content to map to Object due to end of input 
12:03:44,195 ERROR [STDERR] java.io.EOFException: No content to map to Object due to end of input 
12:03:44,196 ERROR [STDERR]  at org.codehaus.jackson.map.ObjectMapper._initForReading(ObjectMapper.java:1630) 
12:03:44,196 ERROR [STDERR]  at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:1580) 
12:03:44,196 ERROR [STDERR]  at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1158) 

谁能帮我解释为什么发生这种情况?我想也许是因为这些信息是空的,但我试图将虚假数据放在那里,但仍然失败。我查找了ObjectMapper代码,它似乎认为它找不到第一个标记(我是否正确?),但我看不出它为什么无法找到它?

任何帮助将不胜感激!

+26

但是它是如何解决的? – andyb 2011-10-11 14:51:04

+2

答案在哪里? – 2013-06-26 08:25:34

回答

1

我刚碰到同样的问题。我的回应有很长的一段时间。将其转换为字符串可帮助您避开最初的异常。然而,这并没有解决所有问题,所以我最终为映射中涉及的所有poj添加了0-arg构造函数。之后,制图人员完美地工作。

+2

将0-arg构造函数添加到pojo中?我不明白... 从上面的例子你有一个JSON数据,然后....怎么样? @jrb – gumuruh 2012-04-04 19:54:50

+0

例如:'response.getEntity(Foo.class);'在Foo中你需要'public Foo(){}'构造函数。 – mico 2016-11-23 09:17:14

5

我也遇到了这个问题。在Spring MVC的HandlerInterceptorAdaptor这是为了记录所有传入的HTTP请求,我有这个代码:

LOG.trace("[REQUEST/Body]: \n" + IOUtils.toString(request.getInputStream())); 
LOG.trace("[REQUEST/Content-Type]: " + request.getContentType()); 

不幸的是,通过使用getInputStream(),我会读给InputStream结束。注释掉第一行就修正了它。当HTTP请求到达我的控制器时,它已经到达输入的结尾,如异常所述。有道理,我的错误!

1

我也遇到了这个问题,但原因只是一个empty string

在我们的情况下,提供一个空字符串,我们得到:java.io.EOFException: No content to map to Object due to end of input

要解决这个请处理之前验证JSON数据。

4

即使我在我的Spring MVC项目中面对REST调用时遇到了同样的问题。我的代码中的错误是我在控制器方法中使用@RequestBody调用GET。 我映射了POST请求的方法,问题是解决

0

我刚刚得到同样的错误。跟踪之后,我的问题是由在javascript函数中传递的错误参数导致的,导致未定义的数据被发送到REST服务。

日志如下,行“内容长度:0”暗示根本原因。

642 > PUT http://localhost:8080/******** 
642 > Host: localhost:8080 
642 > Connection: keep-alive 
642 > Content-Length: 0 
642 > Accept: */* 
642 > Origin: http://localhost:8080 
642 > X-Requested-With: XMLHttpRequest 
0

我遇到了这个问题,但我用curl发送请求。

用于数据段的原始命令是

-d "{'ID':123, 'Name':'ABC'}" 

后予改变的数据部分,以

-d '{"ID":123, "Name":"ABC"}' 

的问题得到解决。

0

我得到了同样的问题,因为我的一些JSON属性的值为null。从JSON中删除空值完全消除了错误。

0

当我发送请求作为HTTP GET方法时,在将HTTP GET更改为HTTP POST方法后,我遇到了这个问题,此问题已解决。你可以试试,我说,希望这将有助于你....

2

在我来说,我曾经两次@RequestBody在相同的处理方法,喜欢这里:

public String handle(@RequestBody String body, 
        @RequestBody @Valid RequestParams obj) {...} 

所以,我删除的一个他们和它的帮助。

0

我遇到了JAX-RS的问题。我使用@QueryParam参数来提取URI查询参数。没有它,一切工作正常。

1

如果您在过滤器中多次调用doFilter,也会发生此错误。

例如

public class MyFilter implements Filter { 

@Override 
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws ServletException { 
    /* do something */ 
     //first call succeeds 
     filterChain.doFilter(servletRequest, servletResponse); 
    /* do some other things */ 
     //second call results in java.io.EOFException: No content to map to Object due to end of input 
     filterChain.doFilter(servletRequest, servletResponse); 
} 

@Override 
public void init(FilterConfig cfg) throws ServletException { 
} 

@Override 
public void destroy() {} 
} 
0

我在测试REST服务时也遇到了这个问题。我使用了从不正确的jar引用的@PathParam属性。请检查您的import语句,看是否PathParamjavax.ws.rs.PathParam读或不

0

我也面临着同样的问题,这里的“services.json”文件不同时运行,所以ObjectMapper抛出java.io.EOFException的存在:无内容映射到对象由于输入结束,

例如: - InputStream fileIs = JsonServiceList.class.getResourceAsStream(“services.json”); JSONNode jNodeService = new ObjectMapper()。readTree(fileIs);

一旦我使它在运行时可用,它就开始工作。

+0

你能澄清你做了什么来解决这个问题吗? – 2018-01-30 12:33:42