java - HandlerInterceptor 有一个对象处理程序参数,什么类型将被传递到拦截器中?

标签 java spring spring-boot spring-mvc

HandlerInterceptor 接口(interface)有一个参数Object handler,这意味着实现代码必须对处理程序对象进行类型检查才能使用它,并根据需要进行强制转换.

我发现的代码片段似乎假设处理程序始终是一个 HandlerMethod 对象,如果情况并非如此,则返回 true,但我想了解为什么这似乎是一个常见的实现进行稳健的实现。

实现此接口(interface)的标准方法似乎是:

import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        if (handler instanceof HandlerMethod) {
            // ...
            return x; // whether or not to proceed with execution
        }
        return true; // fallback value in case handler wasn't a HandlerMethod
    }
}

Spring javadoc似乎忽略了接口(interface)中有一个Object类型的事实,这对我理解这个接口(interface)非常没有帮助。

一些可能有助于我理解这个接口(interface)应该如何实现的问题:

  • 如果我们得到的处理程序不是我们期望的对象,为什么 true 是一个合理的默认值?
  • HandlerInterceptorhandler 参数可以采用哪些类型?
  • 在什么情况下handler可以是不同的类型(如果有)?
  • 为什么它是一个对象,而不是一个HandlerMethod参数?

最佳答案

基本上,handler 参数可以是 HandlerAdapter 的任何类型。存在。最常用的是利用 HandlerMethodRequestMappingHandlerAdapter

但它可以是常规类、servlet,甚至是函数(当使用函数式方法时)。 Spring Web Services 也有一个实现以及 Spring Integration。

Spring 本身将支持以下开箱即用的

所以不,它并不总是HandlerMethod,但对于大多数用户来说它是。

关于java - HandlerInterceptor 有一个对象处理程序参数,什么类型将被传递到拦截器中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72186135/

相关文章:

java - Prometheus ServletRegistrationBean 在某些工作区中不起作用

spring - 在Spring boot中加载具有最近邻居的neo4j节点

java - 转储不带模式的 Avro 字节

java - 使用 jdbc8.jar 和 Oracle 客户端 18 时 native 内存分配 (mmap) 无法映射

java - 由于 HTML 中存在 '&' 字符,使用 SAX 解析失败

java - 从 Spring REST Controller 返回流

java - 带有main方法的spring3注解

java - 为什么 httpclient 在 DO droplet 上有不同的行为(与 SSL 相关)?

spring - 让 Spring 意识到 Jersey 过滤器

spring - 如何在 Spring Boot REST 服务的 @PreAuthorize 注释中验证 OAuth 2.0 token 用户详细信息