李锋镝的博客

  • 首页
  • 时间轴
  • 说说
  • 每日心情
  • Now
  • 系列文章
  • 论坛
  • 左邻右舍
    • 左邻右舍
    • 博友圈
  • 留言
    • 留言
    • 走心评论
  • 关于
    • 关于本站
    • 网站地图
    • 网站统计
    • 另一个网站
    • 我的导航站
    • 赞助
  • 🚇开往
!Destiny
惟坚韧者始能遂其志
  1. 首页
  2. 原创
  3. 正文

HandlerMethodArgumentResolver解析

2025年3月14日 约 738 字3 分钟 152 0 0
本文最后更新于 2025年3月14日,距今已 556 天,其中的信息可能已经发生变化,请注意甄别。

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

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
分享到

HandlerMethodArgumentResolver解析

也可使用浏览器菜单中的「分享」功能

微信扫一扫分享

标签: Spring
最后更新:2025年3月14日

岁月同一天 9 月 22 日

回望过去的今天,你在写什么

  • 3 年前 2023年9月22日
    《人生海海》读后感

    前段时间读完了麦家的《人生海海》,起初对人生海海这个词不太理解,记得第一次听到这个词,应该是在《欢喜就好》这首歌里,里面…

  • 4 年前 2022年9月22日
    OHCache使用

    OHCache介绍 缓存框架OHC基于Java语言实现,并以类库的形式供其他Java程序调用,是一种以单机模式运行的堆外…

相关文章
  • Spring Boot 指定外部配置文件的方式2026年8月6日
  • Spring中@NotNull、@NotBlank、@NotEmpty的区别2019年7月2日
  • Spring事件驱动深度指南:从单机异步到亿级流量,比MQ更轻的架构神器2025年11月3日
  • Spring Boot 配置加载优先级总结2026年8月6日
  • 关于服务的探活端口和业务端口不一致有什么问题2026年8月3日

李锋镝

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

打赏 点赞
< 上一篇
下一篇 >
1234567891112131415161718192021222324252627282930313233343536373839404142434446474849505152535455575859606162636465666769727476777879808182858687909293949596979899
取消回复
…

文章评论

还没有评论,快来抢沙发吧~

东风夜放花千树。更吹落、星如雨。宝马雕车香满路。凤箫声动,玉壶光转,一夜鱼龙舞。
蛾儿雪柳黄金缕。笑语盈盈暗香去。众里寻他千百度。蓦然回首,那人却在,灯火阑珊处。

听点儿音乐吧 朋友~
文章目录
最新 热点 随机
最新 热点 随机
让WordPress静态化之Rocket‑Nginx WordPress下一代默认主题Ipsum预览 C++之父重磅发声:AI编程正在毁掉一代程序员 支撑全网40%网站的WordPress正在重新拥抱PHP生态 Kratos-plus v1.1.24版本更新说明 关于主题加载速度优化的一点儿小演进
关于主题加载速度优化的一点儿小演进给主题增加了Now、每日心情、年度回顾、岁月同一天、随机漫步等功能WordPress缓存插件WP Fastest Cache、WP Rocket 、FlyingPress对比关于使用AI的一些思考Kratos+ v1.1.16版本更新说明AI时代,个人技术博客的出路在哪里?
SpringBoot和SpringCloud版本对应 这个中秋节感觉过的好累啊 Consul开启transparent-proxy访问外部资源的时候,请求偶发Connection reset问题分析 WordPress缓存插件WP Fastest Cache、WP Rocket 、FlyingPress对比 解决Cannot connect to core dump or remote debug server. Use jhsdb jmap instead Java简介
最近评论
李锋镝 发布于 2 天前(09月20日) 静态博客我之前也用过,但是感觉不是很方便,后来就一直用的WordPress
Sheep5 发布于 2 天前(09月20日) 我直接用静态博客,天然有速度优势。
不凡 发布于 2 天前(09月20日) 主要是wordpress插件丰富,需要什么功能插件,插件市场应有尽有,typecho是性能更好、更轻...
李锋镝 发布于 2 天前(09月20日) 忒极简了,而且这个布局我也搞不懂
李锋镝 发布于 2 天前(09月20日) 哈哈哈~自定义的功能都是符合自己需求的
标签聚合
AI编程 JAVA Claude 日常 SpringBoot IDEA 分布式 Spring SQL MySQL MQ AI 多线程 JVM ElasticSearch Redis K8s 数据库 WordPress 架构
友情链接
  • Honesty
  • sssr7844的博客
  • 知向前端
  • 彬红茶日记
  • 懋和道人
  • 哥斯拉
  • 韩情脉脉
  • 搬砖日记
  • 若梦博客
  • 韩小韩博客
  • 临窗旋墨
  • lijie blog
  • Mr.Sun的博客
  • 蜗牛工作室
  • 林羽凡
  • 瓦匠个人小站
  • 老张博客
  • 志文工作室
  • 九仞之行
  • 皮皮社

COPYRIGHT © 2016-2026 lifengdi.com. ALL RIGHTS RESERVED.

lifengdi.com

Domain age badge for lifengdi.com

Theme Kratos-plus By Dylan Li

津ICP备2024022503号-3

京公网安备11011502039375号