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

我发现的代码片段似乎假定处理程序始终是HandlerMethod对象,如果不是这样,则返回true,但我想理解为什么这似乎是一个常见的实现,可以实现健壮的实现.

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

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似乎忽略了一个事实,即接口中有一个对象类型,这对我理解这个接口非常没有帮助.

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

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

推荐答案

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

但它可以是一个常规类、一个servlet,甚至是一个函数(当使用函数方法时).SpringWeb服务还有一个实现和Spring集成.

Spring本身将支持以下功能:

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

Java相关问答推荐

是否有一种格式模式,可以在除0之外的数字前面有正负符号?

如何使用CSS为选定但未聚焦的表格行设置背景 colored颜色 ?

如何在返回bigint []值的子查询中使用any?

流迭代列表<;对象>;上的NoSuchElementException

现场观看Android Studio中的变化

在Java中如何从Executors.newFixedThreadPool(MAX_THREAD_COUNT())迁移到虚拟线程

在学习Spring时,通过构造函数参数0表达了不满意的依赖关系

错误:不兼容的类型:Double不能转换为Float

具有多个模式的DateTimeForMatter的LocalDate.parse失败

在不使用instanceof或强制转换的情况下从父类变量调用子类方法

用于Java的Visual Studio代码完成不起作用

JPA无手术同品种器械可能吗?

Java中的一个错误';s stdlib SocksSocketImpl?

当我try 返回可选时,Mock无法正常工作

[Guice/MissingImplementation]:未绑定任何实现

java.util.LinkedList()是如何成为MutableList的实例的?

具有 DayOfWeek 列表的 JPA 实体

Vaadin Flow:设置密码显示按钮属性

如何解释泛型类层次 struct 中子类的返回值类型和参数定义?

如何在 lambda 中烘焙值