Spring 3控制器异常处理程序实现问题

时间:2010-04-13 21:45:23

标签: java spring-mvc exception-handling

我希望实现一个“ExceptionController”来处理在执行其他控制器方法时抛出的异常。我没有在我的应用程序上下文中指定任何HandlerExceptionResolver,因此根据API documentation应该启动AnnotationMethodHandlerExceptionResolver。我在源头验证了这一点。那么为什么以下不起作用?

@Controller
public class ExceptionController {

  @ExceptionHandler(NullPointerException.class)
  public ModelAndView handleNullPointerException(NullPointerException ex) {
    // Do some stuff
    log.error(logging stuff)
    return myModelAndView;
  }
}

@Controller
public class AnotherController {

  @RequestMapping(value="/nullpointerpath")
  public String throwNullPointer() {
    throw new NullPointerException();
  }
}

我在调试日志中看到要求处理异常的三个默认异常处理程序,但没有做任何事情,我看到“DispatcherServlet - 无法完成请求”。其次是用户显示堆栈跟踪和500内部错误。

3 个答案:

答案 0 :(得分:6)

确保您的Exception处理程序返回一个存在/映射到处理程序的视图。

答案 1 :(得分:4)

您应该将exceptionhandler写入您想要处理的同一个类,如下所示。

@Controller
public class AnotherController {
    @ExceptionHandler(NullPointerException.class)
    public ModelAndView handleNullPointerException(NullPointerException ex) {
        // Do some stuff.
        log.error(logging stuff)
        return myModelAndView;
    }

    @RequestMapping(value="/nullpointerpath")
    public String throwNullPointer() {
        throw new NullPointerException();
    }
}

答案 2 :(得分:1)

我认为这不是一个好设计。 Spring中的控制器处理HTTP请求并映射到URL。我不认为“异常”适合任何一个bin。感觉就像是误用了Spring。

异常不是HTTP请求。您不会将例外映射到URL。因此,我得出结论,控制器不应被视为异常处理程序。

控制器是Spring API的一部分,但是你的设计没有按预期使用它们,所以这就是它无法正常工作的原因。重新考虑你的设计。