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
是一个合理的默认值? HandlerInterceptor
的handler
参数可以采用哪些类型?- 在什么情况下
handler
可以是不同的类型(如果有)? - 为什么它是一个
对象
,而不是一个HandlerMethod
参数?
最佳答案
基本上,handler
参数可以是 HandlerAdapter
的任何类型。存在。最常用的是利用 HandlerMethod
的 RequestMappingHandlerAdapter
。
但它可以是常规类、servlet,甚至是函数(当使用函数式方法时)。 Spring Web Services 也有一个实现以及 Spring Integration。
Spring 本身将支持以下开箱即用的
-
HandlerMethod
-
HandlerFunction
-
Controller
-
Servlet
-
HttpRequestHandler
-
WsdlDefinition
(Spring Web 服务) -
XsdDefinition
(Spring Web 服务)
所以不,它并不总是HandlerMethod
,但对于大多数用户来说它是。
关于java - HandlerInterceptor 有一个对象处理程序参数,什么类型将被传递到拦截器中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72186135/