问题原因 :
因为项目中需要在参数序列化之前拦截接口实际调用的请求参数,所以重写了HttpServletRequestWrapper的相关方法。在过滤器中处理的时候没有对文件上传的MultipartFiler 的request进行过滤处理, 导致自定义的warpper中读取流的时候报java.nio.charset.MalformedInputException: Input length = 1异常
解决方式:
在过滤器中加上判断, 如果是MultipartFiler不进行自定义的warpper读流处理
具体代码实现请参考: 重写HttpServletRequestWrapper,重复读取request请求流
堆栈信息:
java.nio.charset.MalformedInputException: Input length = 1 at java.nio.charset.CoderResult.throwException(CoderResult.java:281) at org.apache.tomcat.util.buf.B2CConverter.convert(B2CConverter.java:239) at org.apache.catalina.connector.InputBuffer.realReadChars(InputBuffer.java:403) at org.apache.catalina.connector.InputBuffer.checkCharBufferEof(InputBuffer.java:610) at org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:435) at org.apache.catalina.connector.CoyoteReader.read(CoyoteReader.java:108) at org.apache.catalina.connector.CoyoteReader.readLine(CoyoteReader.java:163) at com.dict.aicall.common.utils.RequestReadUtils.read(RequestReadUtils.java:27) at com.xxx.xxx.MyHttpServletRequestWrapper.<init>(MyHttpServletRequestWrapper.java:32) at com.xxx.xxx.MyFilter.doFilter(MyFilter.java:36) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:540) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:895) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1722) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748)
源码分析:
底层方法调用链路图

该问题仅限本人重写HttpServletRequestWrapper在处理request的时候未过滤掉MultipartFiler导致。如有相同情况希望能帮到你。最后感谢大家的阅读!!!
在项目中,为了在参数序列化前拦截接口请求参数,作者重写了HttpServletRequestWrapper。由于未在过滤器中处理MultipartFiler类型的请求,导致读取流时出现java.nio.charset.MalformedInputException。解决方案是在过滤器中添加判断,对于MultipartFiler不使用自定义wrapper读流。问题源于对文件上传请求的处理不当。
4660

被折叠的 条评论
为什么被折叠?



