程序员scholar 程序员scholar
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
npm

(进入注册为作者充电)

  • SpringMVC

    • SpringMVC 入门
    • Spring MVC 数据接收
    • Spring MVC 数据返回
    • Spring MVC 路径匹配规则
    • Spring MVC 内容协商策略
    • Spring MVC 异步请求处理
    • Spring MVC 静态资源处理
    • Spring MVC 自定义格式化器
    • SpringMVC 自定义拦截器
    • SpringMVC 配置跨域(CORS)
    • Spring MVC 自定义视图控制器
    • Spring MVC 自定义视图解析器
    • Spring MVC 自定义方法参数解析器
      • 1. 自定义方法参数解析器配置
      • 2. 实现自定义参数解析器
      • 3. 测试控制器
      • 4. 测试请求与响应
      • 5. 重要的配置与参数说明
      • 6. 应用场景与优势
    • Spring MVC 自定义返回值处理器
    • Spring MVC 自定义消息转换器
    • Spring MVC 消息转换器扩展
    • Spring MVC 自定义异常处理器
    • Spring MVC 自定义异常处理器扩展
  • SpringMVC
  • SpringMVC
scholar
2024-08-17
目录

Spring MVC 自定义方法参数解析器

# Spring MVC 自定义方法参数解析器

前言

Spring MVC 提供了强大的参数解析机制,可以通过实现 HandlerMethodArgumentResolver 接口来创建自定义的参数解析器,从而将请求中的特定数据自动注入到控制器的方法参数中。

# 1. 自定义方法参数解析器配置

在 Spring MVC 中,通过 addArgumentResolvers 方法可以注册自定义的参数解析器,从而增强请求处理逻辑。

@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
    // 在 Spring MVC 中注册自定义的方法参数解析器
    resolvers.add(currentUserMethodArgumentResolver());
}

@Bean
public CurrentUserMethodArgumentResolver currentUserMethodArgumentResolver() {
    // 创建自定义的参数解析器实例
    return new CurrentUserMethodArgumentResolver();
}
1
2
3
4
5
6
7
8
9
10
11
  • addArgumentResolvers 方法:此方法用于向 Spring MVC 的解析器列表中添加自定义的参数解析器。添加的解析器会在请求处理过程中被自动应用。
  • CurrentUserMethodArgumentResolver:这是一个自定义的参数解析器,用于解析特定类型的参数,例如当前登录用户。

# 2. 实现自定义参数解析器

自定义参数解析器需要实现 HandlerMethodArgumentResolver 接口,并重写其中的两个核心方法:

public class CurrentUserMethodArgumentResolver implements HandlerMethodArgumentResolver {

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        // 判断是否支持当前方法参数,这里判断参数类型是否为 User 类
        return parameter.getParameterType().isAssignableFrom(User.class);
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, 
                                  ModelAndViewContainer mavContainer, 
                                  NativeWebRequest webRequest, 
                                  WebDataBinderFactory binderFactory) {
        // 实现参数解析逻辑
        // 模拟从请求中解析用户信息并注入到控制器方法参数中
        User user = new User();
        user.setId("123456"); // 模拟设置用户ID
        return user; // 返回解析后的 User 对象
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  • supportsParameter 方法:用于判断当前解析器是否支持给定的方法参数。如果返回 true,则此解析器会被应用于参数解析。
  • resolveArgument 方法:用于实现具体的参数解析逻辑。例如,可以从请求中提取数据并注入到控制器方法的参数中。

# 3. 测试控制器

创建一个简单的控制器来测试自定义参数解析器的效果:

@RestController
public class TestController {

    @GetMapping("/test5")
    public User test5(User user) {
        // 使用自定义参数解析器注入的 User 对象
        return user; // 返回解析后的用户信息
    }
}
1
2
3
4
5
6
7
8
9

在这个控制器中,User 对象将由自定义的参数解析器自动注入,因此不需要手动解析请求中的数据。

# 4. 测试请求与响应

访问以下地址进行测试:

http://localhost:8080/test5
1

预期响应:

{
    "id": "123456",
    "userName": null,
    "passWord": null,
    "email": null,
    "nickName": null,
    "createTime": null
}
1
2
3
4
5
6
7
8

可以看到,控制器中的 User 参数自动填充了自定义解析器设置的用户信息。

# 5. 重要的配置与参数说明

  • supportsParameter(MethodParameter parameter):确定解析器是否适用于当前参数类型。可以根据参数类型或注解进行判断。
  • resolveArgument 方法的参数:
    • MethodParameter parameter:当前正在解析的参数。
    • ModelAndViewContainer mavContainer:用于控制模型和视图的容器。
    • NativeWebRequest webRequest:封装原生 HTTP 请求和响应。
    • WebDataBinderFactory binderFactory:用于创建数据绑定器,处理参数的绑定和验证。

# 6. 应用场景与优势

自定义参数解析器特别适用于以下场景:

  • 自动解析和注入用户身份信息,例如当前登录用户。
  • 基于请求中的特定数据(如自定义注解)自动填充方法参数,减少重复的解析代码。
  • 在复杂业务场景中,简化控制器方法的参数处理逻辑,提高代码的可读性和维护性。

通过这种配置方式,开发者可以灵活地控制参数解析流程,实现复杂请求处理的自动化和模块化,大大提升了代码的健壮性与扩展性。

编辑此页 (opens new window)
上次更新: 2024/12/28, 18:32:08
Spring MVC 自定义视图解析器
Spring MVC 自定义返回值处理器

← Spring MVC 自定义视图解析器 Spring MVC 自定义返回值处理器→

Theme by Vdoing | Copyright © 2019-2025 程序员scholar
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式