Spring下WebSocket报HttpMediaTypeNotAcceptableException问题分析

news/2025/3/23 22:36:29/

一、问题描述

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

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

org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representationat 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 pipeat 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 representationat 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 representationat 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


http://www.ppmy.cn/news/177819.html

相关文章

倍福plc控制器修改地址

通过远程桌面&#xff0c;device manager管理界面&#xff0c;twincat编程软件查看以及修改控制器IP地址的方法。 通过twincat软件查看控制器的IP地址 使用网线将控制器与PC连接起来&#xff0c;然后twincat进行广播搜索&#xff0c;这种方法可以查看到控制器和电脑连接的网卡…

Linux练习例题(附答案)

1、通过ps命令的两种选项形式查看进程信息 2、通过top命令查看进程 3、通过pgrep命令查看sshd服务

《深入理解计算机系统》笔记-信息的表示和处理

记录&#xff1a;如何缩放csdn中的图片&#xff1a;在#pic_center末尾加上50%x50%&#xff1b;#pic_left&#xff1a;左对齐。 视频地址&#xff1a;https://www.bilibili.com/video/BV1kE411X7S5?p16&spm_id_frompageDriver 文章目录 二、信息的表示和处理1. 信息存储1…

Gartner:全球IT服务支出规模将达8190亿

8月4日消息&#xff0c;据市场分析机构 Gartner 表示&#xff0c;尽管今年的经济前景还存在不确定因素&#xff0c;但用于 IT服务的业务经费将持续增长。 Gartner预计今年全球在 IT服务上的支出增长率为 9.5%&#xff0c;总支出金额将达到 8190亿美元。 据国外媒体报道称&…

Docke安装教程

Dock架构&#xff1a; 镜像&#xff1a;Docker 镜像&#xff08;Image&#xff09;&#xff0c;就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。相当于一个有root的文件系统 容器&#xff1a;镜像&#…

拨码无线网桥的配置+注意事项

https://pinfo.hikvision.com/hkws/unzip/20211122205046_19726_doc/GUID-0838B359-81DA-4169-A3D0-6D20CB6D551D.html 无线网桥顾名思义就是 无线网络 的桥接&#xff0c;它利用无线传输方式实现在两个或多个网络之间搭起通信的桥梁&#xff1b;无线网桥从通信机制上分为电路…

【Docker系列】Docker教程:详细全部

【Docker系列】非常详细的Docker 基础 【Docker系列】这可能是最为详细的Docker入门吐血总结 【Docker系列】 狠心复习了这Docker门核心知识点&#xff0c;熬夜整理成送给大家【硬核】 【Docker系列】Docker经典教程 【Docker系列】Docker概念与安装 【Docker系列】 Docke…

IIS 端口netstat -ano命令

IIS 端口netstat -ano命令 netstat -ano 查看机器端口占用情况 windows下dos命令窗口输入netstat -ano即可查看端口使用情况&#xff0c;如果要查看指定端口是否被占用可以使用命令netstat -ano|findstr 端口号 例如要查看8080端口号是否已经被占用就使用命令netstat -ano|fin…