Spring下WebSocket报HttpMediaTypeNotAcceptableException问题分析

一、问题描述

在我们使用WebSocket的过程中,突然间发现线上的环境抛出了HttpMediaTypeNotAcceptableException异常,

请求的uri:/im/conn/074/q4rvc1nc/xhr_streaming,异常堆栈如下:

org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation
    at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:308) ~[spring-webmvc-5.1.10.RELEASE.jar:5.1.10.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor.handleReturnValue(HttpEntityMethodProcessor.java:226) ~[spring-webmvc-5.1.10.RELEASE.jar:5.1.10.RELEASE]
    at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:82) ~[spring-web-5.1.10.RELEASE.jar:5.1.10.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:123) ~[spring-webmvc-5.1.10.RELEASE.jar:5.1.10.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:893) ~[spring-webmvc-5.1.10.RELEASE.jar:5.1.10.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:798) ~[spring-webmvc-5.1.10.RELEASE.jar:5.1.10.RELEASE]
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.1.10.RELEASE.jar:5.1.10.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) [spring-webmvc-5.1.10.RELEASE.jar:5.1.10.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) [spring-webmvc-5.1.10.RELEASE.jar:5.1.10.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) [spring-webmvc-5.1.10.RELEASE.jar:5.1.10.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) [spring-webmvc-5.1.10.RELEASE.jar:5.1.10.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:652) [tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) [spring-webmvc-5.1.10.RELEASE.jar:5.1.10.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) [tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) [tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:711) [tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:581) [tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:517) [tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:392) [tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.catalina.core.StandardHostValve.status(StandardHostValve.java:257) [tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:352) [tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.catalina.core.AsyncContextImpl.setErrorState(AsyncContextImpl.java:438) [tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.catalina.connector.CoyoteAdapter.asyncDispatch(CoyoteAdapter.java:173) [tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.coyote.AbstractProcessor.dispatch(AbstractProcessor.java:246) [tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:59) [tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:831) [tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1629) [tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-8.5.65.jar:8.5.65]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_192]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_192]
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.65.jar:8.5.65]
    at java.lang.Thread.run(Thread.java:748) [na:1.8.0_192]

线上功能都是正常的,为什么会一直抛这个错误呢?

二、前路漫漫

1、日志级别调整:

因为线上的日志级别问题,只能看到这么多,还以为是这个URL处理有问题,在测试环境上面进行了定位,把日志级别调成debug,从日志里面看到“Content-Type:application/javascript;charset=UTF-8”,还以为这是前端传入的,还特意的问了一下前端同事,可人家忙啊,根本没鸟我,于是我心里想等我把请求头打印出来,再来找你。

2、打印关键日志

2.1、首先打印出请求头:req.getHeaderNames()和 对应的HttpMediaTypeNotAcceptableException..getSupportedMediaTypes(),发现前端并没有传入相应的Content-Type,心里暗想还好还好,没有证据心里虚是有好处的,那这个Content-Type:application/javascript到底是哪里设置的呢?

3、本地调试

通过打印出具体的URL,拿到具体的URL(这个地方就是走的弯路,没仔细分析日志),然后通过postman进行请求发送,通过调试知道了这个application/javascript是在XhrStreamingTransportHandler里面设置的,但是不管我尝试多少次,这个请求都是成功的,并不会报HttpMediaTypeNotAcceptableException异常,陷入了沉思,到底是哪里出现了问题?

三、峰回路转

1、善于捕捉关键日志

本地调试不出来,那么就上测试环境,等待异常的再次出现,终于它来了:

DEBUG | org.apache.coyote.http11.Http11Processor | log | http-nio-8080-exec-10 | 175 | org.apache.juli.logging.DirectJDKLog | Error state [CLOSE_NOW] reported while processing request | java.io.IOException: Broken pipe
    at sun.nio.ch.FileDispatcherImpl.write0(Native Method) ~[na:1.8.0_192]
    at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:47) ~[na:1.8.0_192]
    at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:93) ~[na:1.8.0_192]
    at sun.nio.ch.IOUtil.write(IOUtil.java:65) ~[na:1.8.0_192]
    at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:471) ~[na:1.8.0_192]
    at org.apache.tomcat.util.net.NioChannel.write(NioChannel.java:140) ~[tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.tomcat.util.net.NioBlockingSelector.write(NioBlockingSelector.java:118) ~[tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.tomcat.util.net.NioSelectorPool.write(NioSelectorPool.java:167) ~[tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.doWrite(NioEndpoint.java:1318) ~[tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.tomcat.util.net.SocketWrapperBase.doWrite(SocketWrapperBase.java:718) ~[tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.tomcat.util.net.SocketWrapperBase.flushBlocking(SocketWrapperBase.java:671) ~[tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.tomcat.util.net.SocketWrapperBase.flush(SocketWrapperBase.java:661) ~[tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.coyote.http11.Http11OutputBuffer$SocketOutputBuffer.flush(Http11OutputBuffer.java:654) ~[tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.coyote.http11.filters.ChunkedOutputFilter.flush(ChunkedOutputFilter.java:166) ~[tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.coyote.http11.Http11OutputBuffer.flush(Http11OutputBuffer.java:255) ~[tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.coyote.http11.Http11Processor.flush(Http11Processor.java:1433) ~[tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.coyote.AbstractProcessor.action(AbstractProcessor.java:407) ~[tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.coyote.Response.action(Response.java:206) ~[tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:324) ~[tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.catalina.connector.OutputBuffer.flush(OutputBuffer.java:291) ~[tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.catalina.connector.Response.flushBuffer(Response.java:503) ~[tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.catalina.connector.ResponseFacade.flushBuffer(ResponseFacade.java:304) ~[tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.springframework.http.server.ServletServerHttpResponse.flush(ServletServerHttpResponse.java:91) ~[spring-web-5.1.10.RELEASE.jar:5.1.10.RELEASE]
    at org.springframework.web.socket.sockjs.transport.session.AbstractHttpSockJsSession.writeFrameInternal(AbstractHttpSockJsSession.java:359) ~[spring-websocket-5.1.10.RELEASE.jar:5.1.10.RELEASE]
    at org.springframework.web.socket.sockjs.transport.session.AbstractSockJsSession.writeFrame(AbstractSockJsSession.java:324) ~[spring-websocket-5.1.10.RELEASE.jar:5.1.10.RELEASE]
    at org.springframework.web.socket.sockjs.transport.session.AbstractSockJsSession.sendHeartbeat(AbstractSockJsSession.java:257) ~[spring-websocket-5.1.10.RELEASE.jar:5.1.10.RELEASE]
    at org.springframework.web.socket.sockjs.transport.session.AbstractSockJsSession$HeartbeatTask.run(AbstractSockJsSession.java:461) ~[spring-websocket-5.1.10.RELEASE.jar:5.1.10.RELEASE]
    at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) ~[spring-context-5.1.10.RELEASE.jar:5.1.10.RELEASE]
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[na:1.8.0_192]
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[na:1.8.0_192]
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) ~[na:1.8.0_192]
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) ~[na:1.8.0_192]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[na:1.8.0_192]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[na:1.8.0_192]
    at java.lang.Thread.run(Thread.java:748) [na:1.8.0_192]
|

DEBUG | org.apache.coyote.AsyncStateMachine | log | http-nio-8080-exec-10 | 173 | org.apache.juli.logging.DirectJDKLog | Changing async state from [COMPLETING] to [ERROR] |
DEBUG | org.apache.catalina.core.AsyncContextImpl | log | http-nio-8080-exec-10 | 173 | org.apache.juli.logging.DirectJDKLog | Firing onError() event for any AsyncListeners |
DEBUG | org.apache.catalina.core.ContainerBase.[Tomcat].[localhost] | log | http-nio-8080-exec-10 | 173 | org.apache.juli.logging.DirectJDKLog | Processing ErrorPage[errorCode=0, location=/error] |
DEBUG | org.springframework.web.servlet.DispatcherServlet | traceDebug | http-nio-8080-exec-10 | 91 | org.springframework.core.log.LogFormatUtils | "INCLUDE" dispatch for POST "/error?t=1651888966496", parameters={masked} |
DEBUG | org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping | getHandler | http-nio-8080-exec-10 | 421 | org.springframework.web.servlet.handler.AbstractHandlerMapping | Mapped to public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController.error(javax.servlet.http.HttpServletRequest) |
DEBUG | org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor | writeWithMessageConverters | http-nio-8080-exec-10 | 224 | org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor | Found 'Content-Type:application/javascript;charset=UTF-8' in response |
DEBUG | org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver | doResolveHandlerMethodException | http-nio-8080-exec-10 | 404 | org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver | Using @ExceptionHandler public Response<java.lang.String> GlobalExceptionHandler.handleHttpMediaTypeNotAcceptableException(javax.servlet.http.HttpServletRequest,org.springframework.web.HttpMediaTypeNotAcceptableException) |
WARN | GLOBAL-EXCEPTION-HANDLER | handleHttpMediaTypeNotAcceptableException | http-nio-8080-exec-10 | 177 | GlobalExceptionHandler | 请求头字段:[{"content-length":"0","x-forwarded-proto":"http","accept-language":"zh-CN,zh;q=0.9","cookie":"","origin":"","x-forwarded-port":"80","x-forwarded-for":"10.12.68.28","accept":"*/*","x-real-ip":"10.12.68.28","accept-encoding":"gzip, deflate","user-agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36"}]与响应头的Content-Type:[application/octet-stream, text/plain, application/xml, text/xml, application/x-www-form-urlencoded, application/x-jackson-smile, application/*+xml, multipart/form-data, application/json, application/cbor, application/*+json, */*]不匹配,url=/im/conn/473/tescyip5/xhr_streaming?t=1651888966496 | org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation
    at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:308) ~[spring-webmvc-5.1.10.RELEASE.jar:5.1.10.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor.handleReturnValue(HttpEntityMethodProcessor.java:226) ~[spring-webmvc-5.1.10.RELEASE.jar:5.1.10.RELEASE]
    at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:82) ~[spring-web-5.1.10.RELEASE.jar:5.1.10.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:123) ~[spring-webmvc-5.1.10.RELEASE.jar:5.1.10.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:893) ~[spring-webmvc-5.1.10.RELEASE.jar:5.1.10.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:798) ~[spring-webmvc-5.1.10.RELEASE.jar:5.1.10.RELEASE]
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.1.10.RELEASE.jar:5.1.10.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) ~[spring-webmvc-5.1.10.RELEASE.jar:5.1.10.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) ~[spring-webmvc-5.1.10.RELEASE.jar:5.1.10.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) [spring-webmvc-5.1.10.RELEASE.jar:5.1.10.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) [spring-webmvc-5.1.10.RELEASE.jar:5.1.10.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:652) [tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) [spring-webmvc-5.1.10.RELEASE.jar:5.1.10.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) [tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) [tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:711) [tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:581) [tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:517) [tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:392) [tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.catalina.core.StandardHostValve.status(StandardHostValve.java:257) [tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:352) [tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.catalina.core.AsyncContextImpl.setErrorState(AsyncContextImpl.java:438) [tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.catalina.connector.CoyoteAdapter.asyncDispatch(CoyoteAdapter.java:173) [tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.coyote.AbstractProcessor.dispatch(AbstractProcessor.java:246) [tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:59) [tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:831) [tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1629) [tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-8.5.65.jar:8.5.65]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_192]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_192]
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.65.jar:8.5.65]
    at java.lang.Thread.run(Thread.java:748) [na:1.8.0_192]
|

DEBUG | org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor | writeWithMessageConverters | http-nio-8080-exec-10 | 224 | org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor | Found 'Content-Type:application/javascript;charset=UTF-8' in response |
WARN | org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver | doResolveHandlerMethodException | http-nio-8080-exec-10 | 420 | org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver | Failure in @ExceptionHandler public Response<java.lang.String> GlobalExceptionHandler.handleHttpMediaTypeNotAcceptableException(javax.servlet.http.HttpServletRequest,org.springframework.web.HttpMediaTypeNotAcceptableException) | org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation
    at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:308) ~[spring-webmvc-5.1.10.RELEASE.jar:5.1.10.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.handleReturnValue(RequestResponseBodyMethodProcessor.java:181) ~[spring-webmvc-5.1.10.RELEASE.jar:5.1.10.RELEASE]
    at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:82) ~[spring-web-5.1.10.RELEASE.jar:5.1.10.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:123) ~[spring-webmvc-5.1.10.RELEASE.jar:5.1.10.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver.doResolveHandlerMethodException(ExceptionHandlerExceptionResolver.java:413) ~[spring-webmvc-5.1.10.RELEASE.jar:5.1.10.RELEASE]
    at org.springframework.web.servlet.handler.AbstractHandlerMethodExceptionResolver.doResolveException(AbstractHandlerMethodExceptionResolver.java:61) [spring-webmvc-5.1.10.RELEASE.jar:5.1.10.RELEASE]
    at org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.resolveException(AbstractHandlerExceptionResolver.java:141) [spring-webmvc-5.1.10.RELEASE.jar:5.1.10.RELEASE]
    at org.springframework.web.servlet.handler.HandlerExceptionResolverComposite.resolveException(HandlerExceptionResolverComposite.java:80) [spring-webmvc-5.1.10.RELEASE.jar:5.1.10.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.processHandlerException(DispatcherServlet.java:1299) [spring-webmvc-5.1.10.RELEASE.jar:5.1.10.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1111) [spring-webmvc-5.1.10.RELEASE.jar:5.1.10.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057) [spring-webmvc-5.1.10.RELEASE.jar:5.1.10.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) [spring-webmvc-5.1.10.RELEASE.jar:5.1.10.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) [spring-webmvc-5.1.10.RELEASE.jar:5.1.10.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) [spring-webmvc-5.1.10.RELEASE.jar:5.1.10.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:652) [tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) [spring-webmvc-5.1.10.RELEASE.jar:5.1.10.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) [tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) [tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:711) [tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:581) [tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:517) [tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:392) [tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.catalina.core.StandardHostValve.status(StandardHostValve.java:257) [tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:352) [tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.catalina.core.AsyncContextImpl.setErrorState(AsyncContextImpl.java:438) [tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.catalina.connector.CoyoteAdapter.asyncDispatch(CoyoteAdapter.java:173) [tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.coyote.AbstractProcessor.dispatch(AbstractProcessor.java:246) [tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:59) [tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:831) [tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1629) [tomcat-embed-core-8.5.65.jar:8.5.65]
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-8.5.65.jar:8.5.65]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_192]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_192]
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.65.jar:8.5.65]
    at java.lang.Thread.run(Thread.java:748) [na:1.8.0_192]
|

WARN | org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver | logException | http-nio-8080-exec-10 | 199 | org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver | Resolved [org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation] |
DEBUG | org.springframework.web.servlet.DispatcherServlet | logResult | http-nio-8080-exec-10 | 1127 | org.springframework.web.servlet.FrameworkServlet | Exiting from "INCLUDE" dispatch, status 200

2、过程分析:

2.1、通信过程中发生了 java.io.IOException: Broken pipe异常

2.2、Tomcat捕获了该异常,并将错误导向了/error路径,ErrorPage[errorCode=0, location=/error] 

2.3、 org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController处理该请求

2.4、BasicErrorController返回的结果是ResponseEntity,而我们设置的 'Content-Type:application/javascript;charset=UTF-8',导致了第一次出现HttpMediaTypeNotAcceptableException

2.5、第一次的HttpMediaTypeNotAcceptableException被我们自己写的GlobalExceptionHandler捕获到,我们进行了处理,然后返回的JSON格式的内容,也与 'Content-Type:application/javascript;charset=UTF-8'冲突,于是就有了第二次HttpMediaTypeNotAcceptableException,此异常被ExceptionHandlerExceptionResolver处理

2.6、最终DispatcherServlet返回:Exiting from "INCLUDE" dispatch, status 200

四、总结

1、该问题可以不处理,直接忽略掉——不做任何改动

2、可以对/error进行进行处理——优化方案

3、解决第二次抛出的HttpMediaTypeNotAcceptableException

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值