2015-05-29 45 views
8

我與春天有4.1.6的應用程序,我創建了一個類來處理所有異常如下:接收錯誤未能調用@ExceptionHandler甚至用自定義@ControllerAdvice定義

@ControllerAdvice 
public class RestControllerAdvice { 
... 
@ExceptionHandler({Exception.class}) 
public ResponseEntity<Result> handleException(final Exception ex) { 
    Result res = new Result(); 
    try { 
     Exception root = (Exception) ExceptionUtils.getRootCause(ex); 
     if (root == null) { 
      root = ex; 
     } 
     if (root instanceof BindException) { 
      handleBindException(root, res); 
     } else if (root instanceof ConstraintViolationException) { 
      handleConstraintViolations(root, res); 
     } else if (root instanceof NoHandlerFoundException) { 
      handleNoHandlerFoundException(root, res); 
     } else { 
      logError(res, ex); 
     } 
    } catch (Exception e) { 
     logError(res, e); 
    } finally { 
     if (!res.hasErrors()) { 
      handleUnexpected(res); 
     } 
    } 
    return new ResponseEntity<Result>(res, OK); 
} 
} 

我意識到,即使我可以捕獲異常,與有關例外沿着我收到其他錯誤消息說以下內容:

ERROR o.s.w.s.m.m.a.ExceptionHandlerExceptionResolver - Failed to invoke @ExceptionHandler method: 
    public org.springframework.http.ResponseEntity<com.foo.Result> 
    com.foo.RestControllerAdvice.handleException(java.lang.Exception) 

即使這不是在任何級別的阻卻,我想知道爲什麼會這樣。有人可以向我解釋這個嗎?

謝謝。

編輯:

完整的日誌

18:11:43.690 [qtp1614440090-27] ERROR o.s.w.s.m.m.a.ExceptionHandlerExceptionResolver - Failed to invoke @ExceptionHandler method: public org.springframework.http.ResponseEntity<com.foo.Result> com.foo.RestControllerAdvice.handleException(java.lang.Exception) 
org.eclipse.jetty.io.EofException: null 
     at org.eclipse.jetty.io.ChannelEndPoint.flush(ChannelEndPoint.java:192) ~[na:na] 
     at org.eclipse.jetty.io.WriteFlusher.flush(WriteFlusher.java:441) ~[na:na] 
     at org.eclipse.jetty.io.WriteFlusher.write(WriteFlusher.java:337) ~[na:na] 
     at org.eclipse.jetty.io.AbstractEndPoint.write(AbstractEndPoint.java:128) ~[na:na] 
     at org.eclipse.jetty.server.HttpConnection$SendCallback.process(HttpConnection.java:646) ~[na:na] 
     at org.eclipse.jetty.util.IteratingCallback.processing(IteratingCallback.java:246) ~[na:na] 
     at org.eclipse.jetty.util.IteratingCallback.iterate(IteratingCallback.java:208) ~[na:na] 
     at org.eclipse.jetty.server.HttpConnection.send(HttpConnection.java:457) [jetty-server-9.2.4.v20141103.jar:9.2.4.v20141103] 
     at org.eclipse.jetty.server.HttpChannel.sendResponse(HttpChannel.java:767) [jetty-server-9.2.4.v20141103.jar:9.2.4.v20141103] 
     at org.eclipse.jetty.server.HttpChannel.write(HttpChannel.java:800) [jetty-server-9.2.4.v20141103.jar:9.2.4.v20141103] 
     at org.eclipse.jetty.server.HttpOutput.write(HttpOutput.java:139) ~[na:na] 
     at org.eclipse.jetty.server.HttpOutput.write(HttpOutput.java:132) ~[na:na] 
     at org.eclipse.jetty.server.HttpOutput.flush(HttpOutput.java:234) ~[na:na] 
     at com.fasterxml.jackson.core.json.UTF8JsonGenerator.flush(UTF8JsonGenerator.java:1037) ~[jackson-core-2.4.3.jar:2.4.3] 
     at com.fasterxml.jackson.databind.ObjectMapper.writeValue(ObjectMapper.java:1889) ~[jackson-databind-2.4.3.jar:2.4.3] 
     at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.writeInternal(AbstractJackson2HttpMessageConverter.java:231) ~[spring-web-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
     at org.springframework.http.converter.AbstractHttpMessageConverter.write(AbstractHttpMessageConverter.java:208) ~[spring-web-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
     at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:161) ~[spring-webmvc-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
     at org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor.handleReturnValue(HttpEntityMethodProcessor.java:146) ~[spring-webmvc-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
     at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:71) ~[spring-web-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
     at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:126) ~[spring-webmvc-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
     at org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver.doResolveHandlerMethodException(ExceptionHandlerExceptionResolver.java:362) ~[spring-webmvc-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
     at org.springframework.web.servlet.handler.AbstractHandlerMethodExceptionResolver.doResolveException(AbstractHandlerMethodExceptionResolver.java:60) [spring-webmvc-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
     at org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.resolveException(AbstractHandlerExceptionResolver.java:138) [spring-webmvc-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
     at org.springframework.web.servlet.handler.HandlerExceptionResolverComposite.resolveException(HandlerExceptionResolverComposite.java:74) [spring-webmvc-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
     at org.springframework.web.servlet.DispatcherServlet.processHandlerException(DispatcherServlet.java:1183) [spring-webmvc-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
     at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1020) [spring-webmvc-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
     at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:971) [spring-webmvc-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
     at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) [spring-webmvc-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
     at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966) [spring-webmvc-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
     at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857) [spring-webmvc-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:687) [servlet-api-3.1.jar:3.1.0] 
     at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842) [spring-webmvc-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) [servlet-api-3.1.jar:3.1.0] 
     at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:800) [jetty-servlet-9.2.4.v20141103.jar:9.2.4.v20141103] 
     at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1669) [jetty-servlet-9.2.4.v20141103.jar:9.2.4.v20141103] 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) [spring-security-web-3.2.7.RELEASE.jar:3.2.7.RELEASE] 
     at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:118) [spring-security-web-3.2.7.RELEASE.jar:3.2.7.RELEASE] 
     at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84) [spring-security-web-3.2.7.RELEASE.jar:3.2.7.RELEASE] 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) [spring-security-web-3.2.7.RELEASE.jar:3.2.7.RELEASE] 
     at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) [spring-security-web-3.2.7.RELEASE.jar:3.2.7.RELEASE] 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) [spring-security-web-3.2.7.RELEASE.jar:3.2.7.RELEASE] 
     at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113) [spring-security-web-3.2.7.RELEASE.jar:3.2.7.RELEASE] 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) [spring-security-web-3.2.7.RELEASE.jar:3.2.7.RELEASE] 
     at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:154) [spring-security-web-3.2.7.RELEASE.jar:3.2.7.RELEASE] 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) [spring-security-web-3.2.7.RELEASE.jar:3.2.7.RELEASE] 
     at com.foo.TokenAuthFilter.doFilter(TokenAuthFilter.java:66) [classes/:na] 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) [spring-security-web-3.2.7.RELEASE.jar:3.2.7.RELEASE] 
     at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:50) [spring-security-web-3.2.7.RELEASE.jar:3.2.7.RELEASE] 
     at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) [spring-security-web-3.2.7.RELEASE.jar:3.2.7.RELEASE] 
     at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87) [spring-security-web-3.2.7.RELEASE.jar:3.2.7.RELEASE] 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) [spring-security-web-3.2.7.RELEASE.jar:3.2.7.RELEASE] 
     at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192) [spring-security-web-3.2.7.RELEASE.jar:3.2.7.RELEASE] 
     at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160) [spring-security-web-3.2.7.RELEASE.jar:3.2.7.RELEASE] 
     at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344) [spring-web-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
     at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261) [spring-web-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
     at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652) [jetty-servlet-9.2.4.v20141103.jar:9.2.4.v20141103] 
     at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) [spring-web-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
     at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
     at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652) [jetty-servlet-9.2.4.v20141103.jar:9.2.4.v20141103] 
     at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:85) [spring-web-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
     at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.1.6.RELEASE.jar:4.1.6.RELEASE] 
     at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652) [jetty-servlet-9.2.4.v20141103.jar:9.2.4.v20141103] 
     at com.foo.config.SimpleCORSFilter.doFilter(SimpleCORSFilter.java:22) [classes/:na] 
     at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652) [jetty-servlet-9.2.4.v20141103.jar:9.2.4.v20141103] 
     at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:585) [jetty-servlet-9.2.4.v20141103.jar:9.2.4.v20141103] 
     at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) [jetty-server-9.2.4.v20141103.jar:9.2.4.v20141103] 
     at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:577) [jetty-security-9.2.4.v20141103.jar:9.2.4.v20141103] 
     at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:223) [jetty-server-9.2.4.v20141103.jar:9.2.4.v20141103] 
     at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1125) [jetty-server-9.2.4.v20141103.jar:9.2.4.v20141103] 
     at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515) [jetty-servlet-9.2.4.v20141103.jar:9.2.4.v20141103] 
     at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185) [jetty-server-9.2.4.v20141103.jar:9.2.4.v20141103] 
     at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1059) [jetty-server-9.2.4.v20141103.jar:9.2.4.v20141103] 
     at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) [jetty-server-9.2.4.v20141103.jar:9.2.4.v20141103] 
     at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:215) [jetty-server-9.2.4.v20141103.jar:9.2.4.v20141103] 
     at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:110) [jetty-server-9.2.4.v20141103.jar:9.2.4.v20141103] 
     at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97) [jetty-server-9.2.4.v20141103.jar:9.2.4.v20141103] 
     at org.eclipse.jetty.server.Server.handle(Server.java:497) [jetty-server-9.2.4.v20141103.jar:9.2.4.v20141103] 
     at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:310) [jetty-server-9.2.4.v20141103.jar:9.2.4.v20141103] 
     at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:248) [jetty-server-9.2.4.v20141103.jar:9.2.4.v20141103] 
     at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:540) [jetty-io-9.2.4.v20141103.jar:9.2.4.v20141103] 
     at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:620) [jetty-util-9.2.4.v20141103.jar:9.2.4.v20141103] 
     at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:540) [jetty-util-9.2.4.v20141103.jar:9.2.4.v20141103] 
     at java.lang.Thread.run(Thread.java:745) [na:1.7.0_71] 
Caused by: java.io.IOException: Broken pipe 
     at sun.nio.ch.FileDispatcherImpl.writev0(Native Method) ~[na:1.7.0_71] 
     at sun.nio.ch.SocketDispatcher.writev(SocketDispatcher.java:51) ~[na:1.7.0_71] 
     at sun.nio.ch.IOUtil.write(IOUtil.java:148) ~[na:1.7.0_71] 
     at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:524) ~[na:1.7.0_71] 
     at org.eclipse.jetty.io.ChannelEndPoint.flush(ChannelEndPoint.java:172) ~[na:na] 
     ... 84 common frames omitted 
+0

請啓用DEBUG級別的日誌記錄,並張貼有關該故障是被記錄的一切:堆棧跟蹤,其他消息,嵌套異常等 –

+0

這[是](http://pastebin.com/ADwrHUPZ)。我試圖擺脫這個令人討厭的「Broken Pipe」消息,所以我試圖理解前面的錯誤,所以我可以使用前面提到的異常。 – dambros

+0

不,我的意思是將pastebin中的文本複製到此處。我們不喜歡遵循無意義的聯繫。 –

回答

8

IOException: Broken pipe表示客戶端關閉了連接。您成功捕獲了異常,但您試圖在最後一行返回對客戶端的響應。我已經成功地與下面的異常處理程序妥善處理:

@ExceptionHandler(IOException.class) 
@ResponseStatus(HttpStatus.SERVICE_UNAVAILABLE) 
public Object exceptionHandler(IOException e) { 
    if (StringUtils.containsIgnoreCase(ExceptionUtils.getRootCauseMessage(e), "Broken pipe")) { 
     return null;  //socket is closed, cannot return any response  
    } else { 
     return new HttpEntity<>(e.getMessage()); 
    } 
} 

進一步的解釋是here