我从邮递员那里打了一个诸如http://localhost:8084/abc/api/v1/xyz
之类的有有效载荷和标头的邮寄请求。我们已经配置了Filter
类,该类在GenericFilterBean
到达控制器之前进行了扩展。它可以执行Filter类的所有代码,但最终执行'chain.doFilter(request, response);'
以将请求转发给控制器方法时,它会抛出以下异常。在Filter类中,我们正在读取有效负载并保存在审计表中。在Controller类方法中,我们具有@RequestBody注释,@ Context HttpServletRequest和BindingResult之类的参数。
18:59:25,779信息[标准输出](默认任务1)18:59:25,778 || WARN | AbstractHandlerExceptionResolver:197 |已解决[org.springframework.http.converter.HttpMessageNotReadableException:读取输入时发生I / O错误信息;嵌套异常是java.io.IOException:UT010029:流已关闭]
请对此提出建议。
答案 0 :(得分:1)
您的过滤器是否正在读取请求的内容?如果是这样,那么您将需要寻找替代方法,因为在没有一些帮助的情况下输入流不太可能被重用。
您可以通过filter方法发布一些代码吗?
Spring提供了至少一种机制来解决此问题,在这里可能会有所帮助,特别是Error: unexpected symbol in "trn_data=subset(trn_data,select =-c(Rye flour"
。您可以创建一个新的ContentCachingRequestWrapper
来将实际请求包装在此包装器中,也可以直接在过滤器中自己使用它。
您可以使用类似这样的内容更新过滤器
Filter
为@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
HttpServletRequest currentRequest = (HttpServletRequest) servletRequest;
ContentCachingRequestWrapper wrappedRequest = new ContentCachingRequestWrapper(currentRequest);
// todo: your magic code, using wrappedRequest to access the body of the request
// note: passing through the wrapped request,
// which allows later handlers to also access the request
chain.doFilter(wrappedRequest, servletResponse);
}
个便笺记下documentation
HttpServletRequest包装器,用于缓存从输入流和读取器读取的所有内容,并允许通过字节数组检索此内容。
您收到的错误表明您正在读取请求的ContentCachingRequestWrapper
,而应该简单地访问包装器的InputStream
方法。