POST请求未从Filter转发到Controller类

时间:2019-11-13 15:56:25

标签: spring spring-mvc servlet-filters

我从邮递员那里打了一个诸如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:流已关闭]

请对此提出建议。

1 个答案:

答案 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方法。