2014-10-07 74 views
5

在我的应用程序中,我有几个只允许POST的RequestMappings。如果某人碰巧在该特定路径上发起GET请求,他们会收到由容器(Tomcat)提供的405错误页面。我可以在web.xml中创建并定义一个405错误页面进行定制。Spring Web MVC的405错误定制处理

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

我已经试过:

  • 与“方法= GET”为每个提到的映射关系的对应方法。这工作正常,但要求我为每个只允许POST的路径创建实际的requestmapping和方法。我觉得这是不必要的重复和混乱。
  • 全局'catch'方法(requestmapping/*):这不起作用,因为Spring将GET方法错误地调用到POST指定的路径上
  • ExceptionHandler注释的方法来处理异常类HttpRequestMethodNotSupportedException:这不起作用。看来Spring在其框架代码中完全抛出并捕获了这个异常。
  • 在web.xml中指定我自己的405。这并不完美,因为我想定制处理而不是静态错误页面。

回答

7

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

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

+2

这是完美的!其他人可能需要注意的一件事是,如果您决定执行此操作并覆盖DefaultHandlerExceptionResolver,则还应该重写Ordered接口中指定的getOrder()方法。在该方法中,您应该返回低于Integer.MAX_VALUE的int。原因在于最低顺序的处理程序在异常处获得第一个镜头。不管怎样,谢谢! – Zaan 2014-10-07 15:32:35

4
Working Code: 

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

In Jsp page (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>