无法读取HTTP消息:org.springframework.http.converter.HttpMessageNotReadableException:缺少必需的请求正文

Had*_*uli 3 spring interceptor

我有和拦截器,由于某些原因,我必须阅读包含在HttpServletRequest这里的POSTED日期:

    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("");
    }
Run Code Online (Sandbox Code Playgroud)

在这个动作之后我得到了400个关于ajax的错误请求无法读取HTTP消息: org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing

Had*_*uli 6

Spring提供了一个名为ContentCachingRequestWrapperextends 的类HttpServletRequestWrapper.此类缓存从getInputStream()和读取的所有内容,getReader() 并允许通过a检索此内容getContentAsByteArray().所以我们可以InputStream为此目的多次检索.这种能力由方法提供ContentCachingRequestWrapper:

 @Override
   public ServletInputStream getInputStream() throws IOException {
        if (this.inputStream == null) {
            this.inputStream = new ContentCachingInputStream(getRequest().getInputStream());
        }
        return this.inputStream;
    }
Run Code Online (Sandbox Code Playgroud)

此类修复UTF-8了以下方法的字符编码问题:

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

是完整的细节ContentCachingRequestWrapper.