Marceau
Marceau

Reputation: 1703

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:

Upvotes: 13

Views: 17225

Answers (3)

harun ugur
harun ugur

Reputation: 1852

You can use spring DefaultHandlerExceptionResolver. 
Override handleHttpRequestMethodNotSupported() method and return your customized.
Status Code: 405




protected ResponseEntity<Object> handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
            ApiError apiError = ApiError.builder()
                    .status(HttpStatus.METHOD_NOT_ALLOWED)
                    .message(ex.getMessage())
                    .build();
    
            return new ResponseEntity<Object>(apiError, new HttpHeaders(), apiError.getStatus());
        }

Response Result:

{
    "status": "METHOD_NOT_ALLOWED",
    "message": "Request method 'POST' not supported",
    "errors": null
}

Upvotes: 0

Md. Kamruzzaman
Md. Kamruzzaman

Reputation: 1905

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>

Upvotes: 12

Angad
Angad

Reputation: 3429

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.

Upvotes: 17

Related Questions