Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Custom handling for 405 error with Spring Web MVC

In my application, I have a few RequestMappings that only allow POST. If someone happens to fire a GET request at that particular path, they get a 405 error page fed by the container (Tomcat). I can create and define a 405 error page in web.xml for customization.

What I want: any request that would result in a 405 error should be handled in a specific controller method.

What I've tried:

  • a method with "method = GET" as a counterpart for each of the mappings mentioned. This works fine, but requires me to create an actual requestmapping and method for every path that only allows POST. I find this unnecessary duplication and clutter.
  • a global 'catch' method (requestmapping /*): this does not work, as Spring takes the GET method to be a wrong call to the path specified with POST only
  • an ExceptionHandler-annotated method to handle exceptions of class HttpRequestMethodNotSupportedException: this does not work. It seems that Spring throws and catches this exception entirely in its framework code.
  • specify my own 405 in web.xml. This is not perfect, as I want to have customized handling rather than a static error page.
like image 522
Marceau Avatar asked Oct 07 '14 14:10

Marceau


2 Answers

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>
like image 107
Md. Kamruzzaman Avatar answered Sep 22 '22 16:09

Md. Kamruzzaman


I would suggest using a Handler Exception Resolver. You can use spring's DefaultHandlerExceptionResolver. Override handleHttpRequestMethodNotSupported() method and return your customized view. This will work across all of your application.

The effect is close to what you were expecting in your option 3. The reason your @ExceptionHandler annotated method never catches your exception is because these ExceptionHandler annotated methods are invoked after a successful Spring controller handler mapping is found. However, your exception is raised before that.

like image 33
Angad Avatar answered Sep 22 '22 16:09

Angad