HandlerMethodArgumentResolver用法

HandlerMethodArgumentResolver

在 Spring MVC 中,处理器方法(handler method)是控制器(Controller)中的函数,负责处理客户端请求。这些请求可能包含各种不同类型的数据,例如表单数据、JSON 数据、路径变量等。为了使得开发者能够方便地访问和处理这些请求数据,Spring MVC 提供了 HandlerMethodArgumentResolver 接口。

HandlerMethodArgumentResolver 在 Spring MVC 框架中充当了一个关键角色,它负责将请求中的信息转换成处理器方法所需的参数类型。换句话说,它允许开发者将请求参数直接映射到处理器方法的参数上,而无需手动解析请求。

使用场景

HandlerMethodArgumentResolver 是Spring MVC框架中的一个核心接口,它扮演着数据绑定和类型转换的重要角色,负责处理控制器方法参数的解析与注入。这一机制极大地增强了Spring框架处理HTTP请求的灵活性和便捷性,允许开发者自定义参数解析逻辑,以支持复杂类型、自定义注解或从请求中提取特定信息。

在Spring MVC处理请求的过程中,接收到HTTP请求后,DispatcherServlet会找到对应的处理器(HandlerMethod)。接着,系统会遍历注册的所有HandlerMethodArgumentResolver实例,寻找能够支持当前处理器方法参数的解析器。这些解析器可以基于参数类型、注解或其他条件进行匹配,实现如从请求体自动绑定JSON数据到Java对象、解析请求参数、处理请求头信息或从Session中获取数据等功能。

开发者可以通过实现HandlerMethodArgumentResolver接口来自定义参数解析逻辑,满足特定业务需求,如权限验证、多语言处理或是自定义的数据过滤等。此外,Spring框架本身也提供了多种内置的实现,如RequestParamMethodArgumentResolver处理@RequestParam注解参数,PathVariableMethodArgumentResolver处理路径变量,以及用于处理请求体的RequestBodyArgumentResolver等,覆盖了大部分常见场景。

关于它的应用场景可以非常多,本文我总结出最为常见、好理解的两个应用场景作为举例说明:

  1. 获取当前登陆人(当然用户)的基本信息
  2. 调整(兼容)数据结构

1.源码解读

public interface HandlerMethodArgumentResolver {
   
   
    boolean supportsParameter(MethodParameter parameter);

    @Nullable
    Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer, NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception;
}
  1. boolean supportsParameter(MethodParameter parameter);
    • 这个方法用于判断当前的解析器是否支持给定的方法参数(MethodParameter)。如果支持,返回 true;否则返回 false
    • 参数 parameter 表示需要解析的方法参数。
  2. @Nullable Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer, NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception;
    • 这个方法用于解析处理器方法的参数,并返回解析后的结果。
    • 参数 parameter 表示需要解析的方法参数。
    • 参数 mavContainer 是一个可空的 ModelAndViewContainer 对象,用于在解析期间存储模型和视图的相关信息。
    • 参数 webRequest 表示当前的 Web 请求对象,类型为 NativeWebRequest
    • 参数 binderFactory 是一个可空的 WebDataBinderFactory 对象,用于创建 WebDataBinder 对象,用于数据绑定和验证。
    • 方法返回一个 @Nullable 注解修饰的 Object 类型的对象,表示解析后的方法参数。如果解析失败或者不适用,可以返回 null
      • 方法可能会抛出异常 Exception,表示解析过程中出现的异常情况。

MethodParameter 是 Spring Framework 提供的一个类,用于描述方法参数的元数据信息。它提供了丰富的方法,用于获取和操作方法参数的各种信息。下面是一些 MethodParameter 类的常用方法及其描述:

  1. getParameterType()

    • 描述:获取方法参数的类型。

    • 示例:

      Class<?> parameterType = methodParameter.getParameterType();
      
  2. getParameterIndex()

    • 描述:获取方法参数在方法参数列表中的索引位置。

    • 示例:

      int parameterIndex = methodParameter.getParameterIndex();
      
  3. getGenericParameterType()

    • 描述:获取方法参数的泛型类型。

    • 示例:

      Type genericParameterType = methodParameter.getGenericParameterType();
      
  4. getMethod()

    • 描述:获取包含此方法参数的方法。

    • 示例:

      Method method = methodParameter.getMethod();
      
  5. hasParameterAnnotation(Class<? extends Annotation> annotationType)

    • 描述:判断方法参数是否有指定类型的注解。

    • 示例:

      boolean hasAnnotation = methodParameter.hasParameterAnnotation(RequestParam.class);
      
  6. getParameterAnnotations()

    • 描述:获取方法参数上的所有注解。

    • 示例:

      Annotation[] annotations = methodParameter.getParameterAnnotations();
      
  7. getParameterName()

    • 描述:获取方法参数的名称(需要编译时开启 -parameters 选项)。

      <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值