【问题标题】:Spring 3 controller exception handler implementation problemsSpring 3 控制器异常处理程序实现问题
【发布时间】:2011-02-07 16:10:08
【问题描述】:

我希望实现一个“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 内部错误的用户。

【问题讨论】:

    标签: java spring-mvc exception-handling


    【解决方案1】:

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

    【讨论】:

    • @predhme,这真的解决了你的问题吗?我有一个和你一样的例子,只有在同一个控制器抛出异常时才会调用@ExceptionHandler 方法。
    • 我后来也注意到了这一点。我想对我来说最重要的事情是设置一个 500 和 404 页面,这样如果有什么我没有抓住,用户就不会看到堆栈跟踪。
    【解决方案2】:

    您应该将异常处理程序写入您要处理的同一类,如下所示。

    @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();
        }
    }
    

    【讨论】:

      【解决方案3】:

      我不认为这是一个好的设计。 Spring 中的控制器处理 HTTP 请求并映射到 URL。我不认为“例外”适合任何一个垃圾箱。对我来说,这感觉像是对 Spring 的滥用。

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

      控制器 Spring API 的一部分,但您的设计没有按预期使用它们,所以这就是它不起作用的原因。重新考虑您的设计。

      【讨论】:

      猜你喜欢
      • 2015-07-12
      • 1970-01-01
      • 2015-05-07
      • 2021-06-27
      • 2017-12-11
      • 1970-01-01
      • 2013-10-07
      • 2020-01-07
      • 1970-01-01
      相关资源
      最近更新 更多