2016-02-22 75 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' –

相关问题