商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > Java中 Spring MVC HandlerInterceptor 在 preHandle 中怎么获取 HandlerMethod 上的注解

Java中 Spring MVC HandlerInterceptor 在 preHandle 中怎么获取 HandlerMethod 上的注解

  发布于2026-07-15 阅读(0)

扫一扫,手机访问

在`preHandle`中需先判断`handler`是否为`HandlerMethod`类型,再通过`getMethod()`获取`Method`对象读取注解;若需类级注解,则用`getBeanType()`获取Controller类。

Ja va中 Spring MVC HandlerInterceptor 在 preHandle 中怎么获取 HandlerMethod 上的注解

在`preHandle`方法里,要拿到目标处理器方法(也就是`HandlerMethod`)上的注解,核心思路其实很直接:先把`handler`参数安全地转换成`HandlerMethod`类型,然后通过它提供的`getMethod()`或`getBeanType()`等方法拿到反射对象,接着就能像平常读注解一样操作了。

确认 handler 是 HandlerMethod 类型

`preHandle`的第二个参数`handler`类型是`Object`,Spring MVC只有匹配到控制器方法时才传进来一个`HandlerMethod`实例。如果是静态资源、错误页或者自定义的`Handler`,那传入的可能就不是这个类型了。所以,一定要先做类型判断,不然直接强转就会抛出`ClassCastException`。常规做法是用`if (handler instanceof HandlerMethod)`来安全判断,如果不满足条件,直接返回`true`(放行)或者按业务需要处理即可。

从 HandlerMethod 提取 Method 并获取注解

确认类型后,通过`((HandlerMethod) handler).getMethod()`就能拿到底层的`ja va.lang.reflect.Method`对象,然后就可以用标准的反射API来读取注解了。常用的几种方式:

  • `method.getAnnotation(YourAnnotation.class)`:获取指定类型的注解实例(单值)
  • `method.getAnnotations()`:获取方法上所有注解的数组
  • `method.isAnnotationPresent(YourAnnotation.class)`:只判断是否存在,性能稍微好一点

注意 Controller 类上注解的获取方式

有时候还需要检查类级别的注解,比如`@RequestMapping`或`@RestController`。这时候就不能用`getMethod()`了,得通过`((HandlerMethod) handler).getBeanType()`拿到控制器类的`Class`对象,再调用`getAnnotation()`:

  • `Class controllerClass = ((HandlerMethod) handler).getBeanType();`
  • `controllerClass.getAnnotation(RestController.class)`

完整示例代码片段

下面是一个典型的写法,在`preHandle`里安全地获取`@GetMapping`和自定义的`@NeedAuth`注解:

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {    if (handler instanceof HandlerMethod) {        HandlerMethod handlerMethod = (HandlerMethod) handler;        Method method = handlerMethod.getMethod();        // 获取方法上的 @NeedAuth 注解        NeedAuth needAuth = method.getAnnotation(NeedAuth.class);        if (needAuth != null && needAuth.required()) {            // 执行鉴权逻辑        }        // 检查是否是 GET 请求(也可用 @GetMapping 判断)        if (method.isAnnotationPresent(GetMapping.class)) {            // 处理 GET 相关逻辑        }    }    return true;}
本文转载于:https://www.php.cn/faq/2822923.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注