使用Spring Web MVC自定义处理405错误

在我的应用程序中,我有一些只允许POST的RequestMappings。 如果有人碰巧在该特定路径上发出GET请求,则会收到容器(Tomcat)提供的405错误页面。 我可以在web.xml中创建并定义405错误页面以进行自定义。

我想要的是:任何导致405错误的请求都应该在特定的控制器方法中处理。

我尝试过的:

  • 一种方法,其中“method = GET”作为所提到的每个映射的对应物。 这工作正常,但要求我为每个只允许POST的路径创建一个实际的请求映射和方法。 我发现这种不必要的重复和杂乱。
  • 一个全局’catch’方法(requestmapping / *):这不起作用,因为Spring将GET方法作为对仅用POST指定的路径的错误调用
  • 一个ExceptionHandler-annotated方法来处理类HttpRequestMethodNotSupportedException的exception:这不起作用。 似乎Spring在其框架代码中完全抛出并捕获此exception。
  • 在web.xml中指定我自己的405。 这并不完美,因为我想要自定义处理而不是静态错误页面。

我建议使用Handler Exception Resolver。 您可以使用spring的DefaultHandlerExceptionResolver 。 覆盖handleHttpRequestMethodNotSupported()方法并返回自定义view 。 这将适用于您的所有应用程序。

效果接近您在选项3中的预期。 @ExceptionHandler注释的方法永远不会捕获exception的原因是因为在找到成功的Spring控制器处理程序映射后调用这些ExceptionHandler带注释的方法。 但是,在此之前会引发您的exception。

工作守则:

 @ControllerAdvice public class GlobalExceptionController { @ExceptionHandler(HttpRequestMethodNotSupportedException.class) public ModelAndView handleError405(HttpServletRequest request, Exception e) { ModelAndView mav = new ModelAndView("/405"); mav.addObject("exception", e); //mav.addObject("errorcode", "405"); return mav; } } 

在Jsp页面(405.jsp)中:

 

HTTP Status 405 - Request Method not Support

The request method does not support. ">home page.