2016-03-14 80 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启动版本,看看是否可以解决问题。

相关问题