一尘不染

春季3-为NoSuchRequestHandlingMethodException创建ExceptionHandler

java

使用Spring 3,我想使用 ExceptionHandler 注释创建一个异常处理程序,该 异常 处理程序将处理
“找不到页面(404)” 请求。我正在使用以下代码来执行此操作。但是,当我指向一个不存在的URL时,将调用Spring定义的默认异常处理程序。

可能是我正在处理 NoSuchRequestHandlingMethodException 异常。如果是,那我应该注册什么例外?

您能否看一下下面的代码,看看我在做什么错?

注意:如果我将 @ExceptionHandler中 的异常更改为 NullPointerException 并创建一个
RequestMapping 来引发空指针,那将起作用。

    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.bind.annotation.RequestMapping;

    import org.springframework.web.servlet.mvc.multiaction.NoSuchRequestHandlingMethodException;

    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    import org.springframework.web.servlet.ModelAndView;

    @Controller
    public class GeneralHandler {
      private final Log logger = LogFactory.getLog(getClass());

      @ExceptionHandler(NoSuchRequestHandlingMethodException.class)
      public ModelAndView handleException (NoSuchRequestHandlingMethodException ex) {
        ModelAndView mav = new ModelAndView();
        logger.error("Exception found: " + ex);
        return mav;
      }
    }

阅读 204

收藏
2020-12-03

共1个答案

一尘不染

@ExceptionHandler@RequestMapping同一类上的方法引发异常时,将调用带注释的方法。因此,当您添加了引发的映射时NullPointerException,该方法就可以了,因为映射的方法和异常处理程序位于同一类中。

当找不到映射时,Spring无法将关联到NoSuchRequestHandlingMethodException您的@ExceptionHandler,因为它无法将请求与处理程序方法进行匹配。在文档中没有明确提到,但这是我观察到的行为。

如果要专门处理此异常,则必须使用更通用的HandlerExceptionResolver方法,而不是更专门的@ExceptionHandler技术。

2020-12-03