2016-02-22 76 views
2

我已經和攔截,並出於某些原因我要讀包含在HttpServletRequest這樣的發表日期:無法讀取HTTP消息:org.springframework.http.converter.HttpMessageNotReadableException:需要請求主體缺少

InputStream inputStream = request.getInputStream(); 
    if (inputStream != null) { 
     bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); 
     char[] charBuffer = new char[128]; 
     int bytesRead = -1; 
     while ((bytesRead = bufferedReader.read(charBuffer)) > 0) { 
      stringBuilder.append(charBuffer, 0, bytesRead); 
     } 
    } else { 
     stringBuilder.append(""); 
    } 

這個動作後,我得到了阿賈克斯 400錯誤的請求無法讀取HTTP消息:org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing

回答

4

Spring提供了一個名爲ContentCachingRequestWrapper的類,它擴展了HttpServletRequestWrapper。此類緩存從 getInputStream()getReader() 中讀取的所有內容,並允許通過getContentAsByteArray()檢索此內容。所以我們可以爲此檢索InputStream多次。通過方法吹在ContentCachingRequestWrapper提供這種能力:

UTF-8
@Override 
    public ServletInputStream getInputStream() throws IOException { 
     if (this.inputStream == null) { 
      this.inputStream = new ContentCachingInputStream(getRequest().getInputStream()); 
     } 
     return this.inputStream; 
    } 

此類修復字符編碼問題具有低於方法:

@Override 
public String getCharacterEncoding() { 
    String enc = super.getCharacterEncoding(); 
    return (enc != null ? enc : WebUtils.DEFAULT_CHARACTER_ENCODING); 
} 

HereContentCachingRequestWrapper全部細節。

2

我猜你有一個方法處理類似如下:

@RequestMapping(value = "/somewhere", method = POST) 
public SomeResponse someHandler(@RequestBody String body, ...) { ... } 

而你在攔截器中讀取了HttpServletRequestInputStream。由於您只能讀取InputStream一次,因此當彈簧試圖讀取InputStream以填充@RequestBody方法參數時,它會失敗並且會投訴HttpMessageNotReadableException

如果您真的需要多次閱讀請求正文,則應添加一個過濾器並裝飾HttpServletRequest以添加Multiple Read功能。欲瞭解更多信息,你可以閱讀這answer

+0

其確實如此。我改變它來過濾。它很好,但它將內容更改爲非Unicode。那這個呢? –

+0

覆蓋過濾器中的'getCharacterEncoding'方法以返回字符編碼的'UTF-8' –

相關問題