无法读取 HTTP 消息:org.springframework.http.converter.HttpMessageNotReadableException:缺少必需的请求正文
Failed to read HTTP message: org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing
我有拦截器,出于某些原因,我必须像这样阅读 HttpServletRequest
中包含的发布日期:
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 个针对 ajax 的错误请求
无法读取 HTTP 消息:org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing
我猜你有一个如下的方法处理程序:
@RequestMapping(value = "/somewhere", method = POST)
public SomeResponse someHandler(@RequestBody String body, ...) { ... }
并且您在拦截器中读取了 HttpServletRequest
的 InputStream
。由于您只能读取 InputStream
一次,当 spring 尝试读取 InputStream
以填充 @RequestBody
方法参数时,它失败并抱怨 HttpMessageNotReadableException
.
如果你真的需要多次读取请求正文,你应该添加一个过滤器并修饰 HttpServletRequest
以添加 Multiple Read
功能。有关详细信息,您可以阅读此 .
Spring 提供了一个名为 ContentCachingRequestWrapper
的 class,它扩展了 HttpServletRequestWrapper
。这 class 缓存了从中读取的所有内容
getInputStream()
和 getReader()
并允许通过 getContentAsByteArray()
检索此内容。因此我们可以为此多次检索 InputStream
。 ContentCachingRequestWrapper
:
中方法 blow 提供的这种能力
@Override
public ServletInputStream getInputStream() throws IOException {
if (this.inputStream == null) {
this.inputStream = new ContentCachingInputStream(getRequest().getInputStream());
}
return this.inputStream;
}
此 class 使用以下方法修复了 UTF-8
的字符编码问题:
@Override
public String getCharacterEncoding() {
String enc = super.getCharacterEncoding();
return (enc != null ? enc : WebUtils.DEFAULT_CHARACTER_ENCODING);
}
Here 是 ContentCachingRequestWrapper
中的完整详细信息。
我有拦截器,出于某些原因,我必须像这样阅读 HttpServletRequest
中包含的发布日期:
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 个针对 ajax 的错误请求
无法读取 HTTP 消息:org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing
我猜你有一个如下的方法处理程序:
@RequestMapping(value = "/somewhere", method = POST)
public SomeResponse someHandler(@RequestBody String body, ...) { ... }
并且您在拦截器中读取了 HttpServletRequest
的 InputStream
。由于您只能读取 InputStream
一次,当 spring 尝试读取 InputStream
以填充 @RequestBody
方法参数时,它失败并抱怨 HttpMessageNotReadableException
.
如果你真的需要多次读取请求正文,你应该添加一个过滤器并修饰 HttpServletRequest
以添加 Multiple Read
功能。有关详细信息,您可以阅读此
Spring 提供了一个名为 ContentCachingRequestWrapper
的 class,它扩展了 HttpServletRequestWrapper
。这 class 缓存了从中读取的所有内容
getInputStream()
和 getReader()
并允许通过 getContentAsByteArray()
检索此内容。因此我们可以为此多次检索 InputStream
。 ContentCachingRequestWrapper
:
@Override
public ServletInputStream getInputStream() throws IOException {
if (this.inputStream == null) {
this.inputStream = new ContentCachingInputStream(getRequest().getInputStream());
}
return this.inputStream;
}
此 class 使用以下方法修复了 UTF-8
的字符编码问题:
@Override
public String getCharacterEncoding() {
String enc = super.getCharacterEncoding();
return (enc != null ? enc : WebUtils.DEFAULT_CHARACTER_ENCODING);
}
Here 是 ContentCachingRequestWrapper
中的完整详细信息。