【问题标题】:Spring MVC Spring Security and Error HandlingSpring MVC Spring 安全性和错误处理
【发布时间】:2013-08-21 18:00:31
【问题描述】:

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

HTTP 状态 404 -

类型状态报告

消息

说明请求的资源不是 可用。

阿帕奇 Tomcat/7.0.37

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

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

只是为了澄清我的意思是我正在返回 JSON。

知道如何处理吗?

【问题讨论】:

    标签: spring rest spring-security


    【解决方案1】:

    throwExceptionIfNoHandlerFound 仅考虑no handlers for request found

    如果配置了default-servlet-handlerDefaultServletHttpRequestHandler 将处理请求。因此,如果此解决方案不起作用,请将其删除并查看(调试)DispatcherServlet 这个地方。

    【讨论】:

      【解决方案2】:

      原因是right there,在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
          }
      }
      

      【讨论】:

      • 请记住在您拥有extends WebMvcConfigurerAdapter 的任何类中禁用(或永远不要启用)configureDefaultServletHandling,否则将永远不会为未映射的 URL 抛出异常,因此永远不会被此方法捕获。从技术上讲,如果您启用此设置,我认为所有 URL 都由 /** 有效映射。
      • 有人可以给我一些线索/提示,说明为什么“基于 Java 的配置”不是“XML 配置”起作用的原因
      猜你喜欢
      • 2015-03-05
      • 2013-07-02
      • 1970-01-01
      • 2013-03-03
      • 2015-10-21
      • 2021-04-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-25
      相关资源
      最近更新 更多