16

I'm using ResponseEntityExceptionHandler for global handling the error and almost working normal, except I want to handle wrong request with spring. By any logic overriding handleNoSuchRequestHandlingMethod should handle this, but insted of handling always get

HTTP Status 404 -

type Status report

message

description The requested resource is not available.

Apache Tomcat/7.0.37

I just got this when enable debuging in console:

WARN : org.springframework.web.servlet.PageNotFound - No mapping found for HTTP request with URI

just to clarify by handling I mean I'm returning JSON.

any idea how to handle this?

2 Answers 2

23

The reason is right there, in the DispatcherServlet class; it sends error response without bothering to call exception handler (by default).

Since 4.0.0.RELEASE this behaviour can be simply changed with throwExceptionIfNoHandlerFound parameter:

Set whether to throw a NoHandlerFoundException when no Handler was found for this request. This exception can then be caught with a HandlerExceptionResolver or an @ExceptionHandler controller method.

XML configuration:

<servlet>
    <servlet-name>rest-dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>throwExceptionIfNoHandlerFound</param-name>
        <param-value>true</param-value>
    </init-param>
</servlet>

Java-based configuration:

public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    void customizeRegistration(ServletRegistration.Dynamic registration) {
        registration.setInitParameter("throwExceptionIfNoHandlerFound", "true");
    }
    ...
}

Then NoHandlerFoundException can be handled like this:

@ControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {

    @Override
    ResponseEntity handleNoHandlerFoundException(NoHandlerFoundException ex,
            HttpHeaders headers, HttpStatus status, WebRequest request) {
        // return whatever you want
    }
}
Sign up to request clarification or add additional context in comments.

2 Comments

Remember to disable (or never enable) configureDefaultServletHandling in whatever class you have that extends WebMvcConfigurerAdapter or an exception will never be thrown for unmapped URLs, and hence can never be caught by this method. Technically I suppose all URLs are effectively mapped by /** if you do enable this setting.
Can someone give me some clue / hint on why "Java-based configuration" is working by not "XML configuration"
2

throwExceptionIfNoHandlerFound take into account only if no handlers for request found.

In case of default-servlet-handler was configured, DefaultServletHttpRequestHandler will handle request. So, if this solution doesn't work, remove it and have a look (debug) this place of DispatcherServlet.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.