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

Mar*_*eau 11 java spring spring-mvc

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

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

我尝试过的:

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

Ang*_*gad 13

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

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

  • 太棒了!其他人可能需要注意的一件事是,如果您决定这样做并覆盖DefaultHandlerExceptionResolver,您还应该覆盖Ordered接口中指定的getOrder()方法.在该方法中,您应该返回低于Integer.MAX_VALUE的任何int.原因是最低有序处理程序获得了异常的第一个镜头.不管怎样,谢谢! (3认同)

Md.*_*man 11

工作守则:

@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;
    }
}
Run Code Online (Sandbox Code Playgroud)

在Jsp页面(405.jsp)中:

<div class="http-error-container">
    <h1>HTTP Status 405 - Request Method not Support</h1>
    <p class="message-text">The request method does not support. <a href="<c:url value="/"/>">home page</a>.</p>
</div>
Run Code Online (Sandbox Code Playgroud)