李锋镝的博客

  • 首页
  • 时间轴
  • 留言
  • 插件
  • 左邻右舍
  • 关于我
    • 关于我
    • 另一个网站
    • 我的导航站
  • 赞助
Destiny
自是人生长恨水长东
  1. 首页
  2. 原创
  3. 正文

HandlerMethodArgumentResolver解析

2025年3月14日 282点热度 0人点赞 0条评论

HandlerMethodArgumentResolver 是 Spring 框架中的一个重要接口,主要用于处理控制器方法参数的解析。在 Spring MVC 中,当一个请求到达控制器方法时,Spring 需要将请求中的数据(如请求参数、请求头、请求体等)转换为控制器方法所需要的参数类型,HandlerMethodArgumentResolver 就负责完成这个转换过程。

接口定义

HandlerMethodArgumentResolver 接口定义如下:

public interface HandlerMethodArgumentResolver {

    /**
     * 判断当前解析器是否支持解析指定的方法参数
     * @param parameter 要检查的方法参数
     * @return 如果支持解析则返回 true,否则返回 false
     */
    boolean supportsParameter(MethodParameter parameter);

    /**
     * 解析方法参数的值
     * @param parameter 要解析的方法参数
     * @param mavContainer 当前请求的 ModelAndViewContainer
     * @param webRequest 当前请求
     * @param binderFactory 用于创建 WebDataBinder 的工厂
     * @return 解析后的参数值
     * @throws Exception 如果解析过程中出现异常
     */
    Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer,
            NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception;
}

主要方法说明

  1. supportsParameter(MethodParameter parameter):该方法用于判断当前解析器是否支持解析指定的方法参数。如果返回 true,则 Spring 会调用 resolveArgument 方法进行参数解析;如果返回 false,则会尝试使用其他解析器。
  2. resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory):当 supportsParameter 方法返回 true 时,Spring 会调用该方法进行参数解析。该方法需要返回解析后的参数值。

使用步骤

以下是使用 HandlerMethodArgumentResolver 的一般步骤:

1. 创建自定义解析器

创建一个类实现 HandlerMethodArgumentResolver 接口,并实现其两个方法。

import org.springframework.core.MethodParameter;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;

public class CustomArgumentResolver implements HandlerMethodArgumentResolver {

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        // 判断是否支持解析该参数类型
        return parameter.getParameterType().equals(CustomObject.class);
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
                                  NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
        // 解析参数逻辑
        CustomObject customObject = new CustomObject();
        // 从请求中获取数据并设置到 customObject 中
        String value = webRequest.getParameter("key");
        customObject.setValue(value);
        return customObject;
    }
}

2. 注册自定义解析器

将自定义解析器注册到 Spring MVC 中,可以通过实现 WebMvcConfigurer 接口来完成。

import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.List;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
        resolvers.add(new CustomArgumentResolver());
    }
}

3. 在控制器方法中使用自定义参数类型

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyController {

    @GetMapping("/test")
    public String test(CustomObject customObject) {
        return "Received: " + customObject.getValue();
    }
}

常见应用场景

  • 自定义请求参数解析:当 Spring 自带的参数解析器无法满足需求时,可以自定义解析器来处理特定类型的请求参数。
  • 用户信息注入:在控制器方法中自动注入当前登录用户的信息,避免在每个方法中手动获取用户信息。
  • 请求头信息解析:将请求头中的信息解析为控制器方法的参数。
除非注明,否则均为李锋镝的博客原创文章,转载必须以链接形式标明本文链接

本文链接:https://www.lifengdi.com/article/4236

相关文章

  • SpringBoot常用注解
  • SpringBoot 中内置的 49 个常用工具类
  • Spring中的Aware接口
  • SpringBoot启动概述(SpringBoot2.1.7)
  • SpringBoot基于redis的分布式锁的实现(源码)
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
标签: Spring
最后更新:2025年3月14日

李锋镝

既然选择了远方,便只顾风雨兼程。

打赏 点赞
< 上一篇
下一篇 >

文章评论

1 2 3 4 5 6 7 8 9 11 12 13 14 15 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 46 47 48 49 50 51 52 53 54 55 57 58 60 61 62 63 64 65 66 67 69 72 74 76 77 78 79 80 81 82 85 86 87 90 92 93 94 95 96 97 98 99
取消回复

COPYRIGHT © 2025 lifengdi.com. ALL RIGHTS RESERVED.

Theme Kratos Made By Dylan

津ICP备2024022503号-3