2016-03-14 56 views
3

我在應用程序的服務器日誌中收到奇怪的異常。當對某個URL進行GET請求時發生異常。該URL的格式如下 -Spring MVC - 無法調用自定義ExceptionHandler

/some_list/{id}/some_method 

處理程序,它的定義是這樣 -

@RestController 
@Validated 
public class SomeController { 
    @Autowired 
    private SomeService someService; 

    @RequestMapping(value = "/some_list/{id}/some_method", method = RequestMethod.GET) 
    public Collection<SomeObject> getCollection(
     @PathVariable @SomeCustomJavaxConstraintValidator String id, 
     @RequestParam(required = true) 
      @SomeCustomJavaxConstraintValidator String someOtherID) { 

     return someService.getSomething(id, someOtherID); 
    } 

    // other methods 
} 

唯一的例外是這樣的(消息格式,以適應問題區) -

2016-03-13 14:46:09.956 ERROR org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver - 
Failed to invoke @ExceptionHandler method: 
    public org.springframework.http.ResponseEntity<SomeEntity> 
     com.hogehoge.GenericExceptionHandler.handleServiceException(
      javax.servlet.http.HttpServletResponse, 
      com.hogehoge.CustomException) 
java.lang.NullPointerException: Name is null 
    at java.lang.Enum.valueOf(Enum.java:236) ~[na:1.8.0_66] 
    at org.springframework.http.HttpMethod.valueOf(HttpMethod.java:27) ~[spring-web-4.2.3.RELEASE.jar:4.2.3.RELEASE] 
    at org.springframework.http.server.ServletServerHttpRequest.getMethod(ServletServerHttpRequest.java:87) ~[spring-web-4.2.3.RELEASE.jar:4.2.3.RELEASE] 
    at org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor.handleReturnValue(HttpEntityMethodProcessor.java:175) ~[spring-webmvc-4.2.3.RELEASE.jar:4.2.3.RELEASE] 
    at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:80) ~[spring-web-4.2.3.RELEASE.jar:4.2.3.RELEASE] 
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:126) ~[spring-webmvc-4.2.3.RELEASE.jar:4.2.3.RELEASE] 
    at org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver.doResolveHandlerMethodException(ExceptionHandlerExceptionResolver.java:363) ~[spring-webmvc-4.2.3.RELEASE.jar:4.2.3.RELEASE] 
    at org.springframework.web.servlet.handler.AbstractHandlerMethodExceptionResolver.doResolveException(AbstractHandlerMethodExceptionResolver.java:60) [spring-webmvc-4.2.3.RELEASE.jar:4.2.3.RELEASE] 
    at org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.resolveException(AbstractHandlerExceptionResolver.java:137) [spring-webmvc-4.2.3.RELEASE.jar:4.2.3.RELEASE] 
    at org.springframework.web.servlet.handler.HandlerExceptionResolverComposite.resolveException(HandlerExceptionResolverComposite.java:74) [spring-webmvc-4.2.3.RELEASE.jar:4.2.3.RELEASE] 
    at org.springframework.web.servlet.DispatcherServlet.processHandlerException(DispatcherServlet.java:1183) [spring-webmvc-4.2.3.RELEASE.jar:4.2.3.RELEASE] 
    at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1020) [spring-webmvc-4.2.3.RELEASE.jar:4.2.3.RELEASE] 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:971) [spring-webmvc-4.2.3.RELEASE.jar:4.2.3.RELEASE] 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) [spring-webmvc-4.2.3.RELEASE.jar:4.2.3.RELEASE] 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) [spring-webmvc-4.2.3.RELEASE.jar:4.2.3.RELEASE] 
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) [spring-webmvc-4.2.3.RELEASE.jar:4.2.3.RELEASE] 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:622) [tomcat8-servlet-api-8.0.26.jar:na] 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) [spring-webmvc-4.2.3.RELEASE.jar:4.2.3.RELEASE] 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) [tomcat8-servlet-api-8.0.26.jar:na] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) [tomcat8-catalina-8.0.26.jar:8.0.26] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) [tomcat8-catalina-8.0.26.jar:8.0.26] 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) [tomcat8-catalina-8.0.26.jar:8.0.26] 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) [tomcat8-catalina-8.0.26.jar:8.0.26] 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) [tomcat8-catalina-8.0.26.jar:8.0.26] 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) [tomcat8-catalina-8.0.26.jar:8.0.26] 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) [tomcat8-catalina-8.0.26.jar:8.0.26] 
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) [tomcat8-catalina-8.0.26.jar:8.0.26] 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) [tomcat8-catalina-8.0.26.jar:8.0.26] 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518) [tomcat8-catalina-8.0.26.jar:8.0.26] 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091) [tomcat8-coyote-8.0.26.jar:8.0.26] 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:673) [tomcat8-coyote-8.0.26.jar:8.0.26] 
    at org.apache.tomcat.util.net.Nio2Endpoint$SocketProcessor.doRun(Nio2Endpoint.java:1074) [tomcat8-coyote-8.0.26.jar:8.0.26] 
    at org.apache.tomcat.util.net.Nio2Endpoint$SocketProcessor.run(Nio2Endpoint.java:1033) [tomcat8-coyote-8.0.26.jar:8.0.26] 
    at org.apache.tomcat.util.net.Nio2Endpoint.processSocket0(Nio2Endpoint.java:594) [tomcat8-coyote-8.0.26.jar:8.0.26] 
    at org.apache.tomcat.util.net.Nio2Endpoint.processSocket(Nio2Endpoint.java:578) [tomcat8-coyote-8.0.26.jar:8.0.26] 
    at org.apache.tomcat.util.net.SecureNio2Channel$1.completed(SecureNio2Channel.java:86) [tomcat8-coyote-8.0.26.jar:8.0.26] 
    at org.apache.tomcat.util.net.SecureNio2Channel$1.completed(SecureNio2Channel.java:79) [tomcat8-coyote-8.0.26.jar:8.0.26] 
    at sun.nio.ch.Invoker.invokeUnchecked(Invoker.java:126) [na:1.8.0_66] 
    at sun.nio.ch.Invoker$2.run(Invoker.java:218) [na:1.8.0_66] 
    at sun.nio.ch.AsynchronousChannelGroupImpl$1.run(AsynchronousChannelGroupImpl.java:112) [na:1.8.0_66] 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_66] 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_66] 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat8-util-8.0.26.jar:8.0.26] 
    at java.lang.Thread.run(Thread.java:745) [na:1.8.0_66] 

GenericExceptionHandler是一個@ControllerAdvice它是這樣註冊的 -

@ControllerAdvice 
public class GenericExceptionHandler { 
    // fields and others...... 

    @ResponseBody 
    @ExceptionHandler(CustomException.class) 
    public ResponseEntity<SomeEntity> handleServiceException(
     HttpServletResponse response, CustomException e) { 

     // method implementation 
    } 

我無法在本地環境中重現此異常,因爲異常顯然是隨機發生的。我試圖在堆棧跟蹤之後調試它,並且它看起來像某種原因HttpServletRequestgetMethod方法返回null(!! ??),結果HttpMethod.valueOf正在拋出此異常,但我不知道這是爲什麼案子。

更新

雖然這是一個春天啓動的應用程序,它正在部署一個獨立的Tomcat服務器上。 POM文件已經使用maven插件進行配置,以便重新打包正確完成。此外,應用程序的包裝已被標記爲war。樣本 -

​​
+1

您是否在您的Web應用程序中打包了一個servlet-api庫,可能與容器中的servlet-api庫衝突? – thirstycrow

+0

@thirstycrow:該應用程序正在部署在一個獨立的tomcat容器上,在此之前它將被spring boot maven插件重新包裝。另外,POM文件中沒有包含servlet-api jar。所以我可以安全地假設沒有重複的servlet依賴關係。請參閱spring boot maven插件配置的更新。 –

回答

1

我查了最新的春源代碼HttpEntityMethodProcessor.java(約175線),我看到的代碼已經略有改變,現在它是不可能得到NPE那裏。 我看到他們之間切換來回幾次: inputMessage.getMethod()== HttpMethod.GET 和 inputMessage.getMethod()等於(HttpMethod.GET)

+0

我將嘗試升級Spring Boot版本並查看問題是否仍然存在。感謝您的洞察力,我認爲這實際上可以解決問題。 –

2

在問候你原來的問題。 Failed to invoke custom ExceptionHandler,這可能是因爲你的ExceptionHandler只處理@ExceptionHandler(CustomException.class),而實際拋出的異常是NullPointerException。我通常還會在我的ExceptionHandler中爲@ExceptionHandler(RuntimeException.class)添加一個方法(處理程序),以便像我的自定義異常一樣處理運行時異常。

關於nullpointer來自哪裏,如上所示,您可以嘗試升級您的Spring啓動版本,看看是否可以解決問題。

相關問題