2010-09-23 20 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

相關問題