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?

Zemzela
  • 3,060
  • 6
  • 23
  • 32

2 Answers2

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
    }
}
Jakub Jirutka
  • 10,269
  • 4
  • 42
  • 35
  • 3
    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. – Geeb Jan 26 '16 at 16:15
  • Can someone give me some clue / hint on why "Java-based configuration" is working by not "XML configuration" – lxnx Dec 20 '16 at 03:16
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.

Grigory Kislin
  • 16,647
  • 10
  • 125
  • 197