Java Spring 3-为NoSuchRequestHandlingMethodException创建ExceptionHandler

Java Spring 3-为NoSuchRequestHandlingMethodException创建ExceptionHandler,java,spring,exception-handling,spring-mvc,Java,Spring,Exception Handling,Spring Mvc,使用Spring3,我喜欢使用ExceptionHandler注释创建一个异常处理程序,该注释将处理“找不到页面(404)”请求。我正在使用以下代码来完成此操作。但当我指向一个不存在的URL时,就会调用Spring定义的默认异常处理程序 可能是我正在处理NoSuchRequestHandlingMethodException异常。如果是,那么我应该注册什么例外 请看一下下面的代码,看看我做错了什么 注意:如果我将@ExceptionHandler中的异常更改为NullPointerExcepti

使用Spring3,我喜欢使用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;
      }
    }

@ExceptionHandler
-当同一类上的
@RequestMapping
方法引发异常时,将调用带注释的方法。因此,当您添加抛出
NullPointerException
的映射时,这是有效的,因为映射的方法和异常处理程序在同一个类中

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

如果您想专门处理此异常,您必须使用更通用的,而不是更专业的
@ExceptionHandler
技术。

您可以使用这种方法,这是一个很好的想法,也很有效,必须仅使用特定的处理程序引发异常,这使得@ExceptionHandler没有看上去那么有用。

在Spring 3.2中,您可以使用ExceptionHandler为所有控制器创建如下所示:

@ControllerAdvice
public class GeneralHandler {

   @ExceptionHandler
   public ModelAndView handleException (NoSuchRequestHandlingMethodException ex) {
        ModelAndView mav = new ModelAndView();
        ...
        return mav;
   }
}
您甚至可以添加更多注释以返回序列化的json

@ExceptionHandler
    @ResponseBody
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public RestError resolveBindingException ( MethodArgumentNotValidException methodArgumentNotValidException, Locale locale )
    {
        BindingResult bindingResult = methodArgumentNotValidException.getBindingResult();
        return getRestError(bindingResult, locale);
    }

非常感谢。我将使用HandlerExceptionResolver方法。这几乎就是我最终所做的,但由于我也使用了ContentNegotingViewResolver,我最终捕获了“异常”,然后将其包装到一个带有JSON和XML序列化注释的类中,并返回它,而不是ModelAndView,因此,客户机最终得到包装器对象的序列化版本。