16

我正在使用ResponseEntityExceptionHandler来全局处理错误并且几乎可以正常工作,除非我想用 spring 处理错误的请求。通过任何逻辑覆盖handleNoSuchRequestHandlingMethod应该处理这个,但处理总是得到

HTTP 状态 404 -

类型状态报告

信息

描述请求的资源不可用。

Apache Tomcat/7.0.37

我刚刚在控制台中启用调试时得到了这个:

警告:org.springframework.web.servlet.PageNotFound - 没有找到带有 URI 的 HTTP 请求的映射

只是通过处理来澄清我的意思是我正在返回 JSON。

知道如何处理吗?

4

2 回答 2

23

原因就在那里,在DispatcherServlet课堂上;它发送错误响应而无需调用异常处理程序(默认情况下)。

从 4.0.0.RELEASE 开始,可以使用 throwExceptionIfNoHandlerFound 参数简单地更改此行为

设置在没有找到该请求的 Handler 时是否抛出 NoHandlerFoundException。然后可以使用 HandlerExceptionResolver 或@ExceptionHandler控制器方法捕获此异常。

XML配置:

<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的配置:

public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

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

然后NoHandlerFoundException可以这样处理:

@ControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {

    @Override
    ResponseEntity handleNoHandlerFoundException(NoHandlerFoundException ex,
            HttpHeaders headers, HttpStatus status, WebRequest request) {
        // return whatever you want
    }
}
于 2014-03-31T00:38:47.603 回答
2

throwExceptionIfNoHandlerFound只有在没有找到请求的处理程序时才考虑。

如果default-servlet-handler已配置,DefaultServletHttpRequestHandler将处理请求。因此,如果此解决方案不起作用,请将其删除并查看(调试)DispatcherServlet.

于 2017-06-06T14:47:55.143 回答