@ControllerAdviceexception处理程序方法未被调用
我正在为Spring MVC中的exception处理示例演示应用程序。我正在尝试Exception Handling With @ControllerAdvice
我按照此链接中描述的步骤进行操作。
但是当我运行我的应用程序时,我得到以下错误
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is com.test.core.ApplicationException
有关详细信息,请参阅我正在处理的课程
ApplicationException.java
public class ApplicationException extends RuntimeException{ /** * */ private static final long serialVersionUID = -9061684361606685158L; private ErrorStatus errorStatus; private int msgNumber; private Object []args; public ApplicationException(){} public ApplicationException(ErrorStatus errorStatus, int msgNumber, Object[] args) { this.errorStatus = errorStatus; this.msgNumber = msgNumber; this.args = args; } //getter setters }
控制器类
ApplicationExceptionController.java
@Controller @RequestMapping("/exception") public class ApplicationExceptionController { @RequestMapping(value="/error",method=RequestMethod.GET) @ResponseBody public void helloException() { throw new ApplicationException(ErrorStatus.NotFound,1,new Object[]{"Website"}); //here ErrorStatus is a enum class } }
这是GlobalExceptionHandler类
GlobalExceptionHandler.java
@ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler public void notFount(){ System.out.println("----------CaughtApplicationException-----------"); } }
调度员servlet.xml中
我使用http:// localhost:8080 / SpringExceptionHandling / exception / error运行上面的应用程序
但我得到以下例外
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is com.test.core.ApplicationException org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:894) org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778) javax.servlet.http.HttpServlet.service(HttpServlet.java:621) javax.servlet.http.HttpServlet.service(HttpServlet.java:722) root cause com.test.core.ApplicationException com.test.controller.ApplicationExceptionController.helloException(ApplicationExceptionController.java:19) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) java.lang.reflect.Method.invoke(Unknown Source) org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:214) org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132) org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:100) org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:604) org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:565) org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80) org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923) org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852) org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882) org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778) javax.servlet.http.HttpServlet.service(HttpServlet.java:621) javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
我通过@ControllerAdviceexception处理程序方法没有被调用此链接但仍然遇到同样的问题请帮助我得到解决方案。我没有得到这个exception的实际原因。
您在exception处理程序中缺少@EnableWebMvc
注释。 您的exception处理程序应该是这样的。
@EnableWebMvc @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler({ApplicationException.class}) public void notFount(){ System.out.println("----------CaughtApplicationException-----------"); } @ExceptionHandler({Exception.class}) public void notFountGlobal(){ System.out.println("----------CaughtApplicationException-----------"); } }
您还需要告诉exception处理程序方法您要在哪个方法中捕获哪个exception。 最后,您可以指定一个方法,该方法可以捕获所有其他exception,并将其传递给Exception.class。 您发布的代码段为我工作。 希望它能解决你的问题。
您需要声明exception,以便可以将该方法映射到exception类型。 您有两种可能性,要么将exception作为参数说明
public void notFount(ApplicationException exception){
要么
将类型添加为@ExceptionHandler注释的值属性
@ExceptionHandler(value = ApplicationException.class)
此外,您很可能遇到配置问题,因为您发布了错误的GlobalExceptionHandler
,servlet将无法启动,明确表示没有exception类型映射到该方法。 确保您正在扫描您的GlobalExceptionHandler
所在的包,从外观GlobalExceptionHandler
,这很可能是您的问题
在我的例子中,由于方法签名中的附加参数,因此不会调用处理程序方法。
不工作:
@ExceptionHandler(NoHandlerFoundException.class) public ModelAndView handle404(HttpServletRequest request, Exception e, @RequestHeader(value = "referer", required = false) final String referer) { ... }
referer
参数是导致不调用处理程序方法的原因。 删除参数后问题得以解决。
作品:
@ExceptionHandler(NoHandlerFoundException.class) public ModelAndView handle404(HttpServletRequest request, Exception e) { ... }