HandlerMethodArgumentResolver 方法参数自动封装设计方案

121 篇文章 0 订阅
85 篇文章 0 订阅

HandlerMethodArgumentResolver 为解析控制器方法参数的核心设计。它允许开发者介入方法参数的解析过程,实现自定义的参数绑定逻辑。以下是接口方法的详细说明和业务场景示例:

肖哥弹架构 跟大家“弹弹” SpringBoot源码,需要代码关注

欢迎 点赞,点赞,点赞。

关注公号Solomon肖哥弹架构获取更多精彩内容

接口方法说明:

  1. supportsParameter:

    • 作用:判断当前的 HandlerMethodArgumentResolver 实现是否支持解析给定的 MethodParameter
    • 参数:MethodParameter 类型的参数,表示控制器方法中的参数。
    • 返回值:如果参数被支持,则返回 true
  2. resolveArgument:

    • 作用:解析并返回方法参数的值。

    • 参数:

      • MethodParameter:方法参数的元数据。
      • ModelAndViewContainer:用于存储模型数据和视图信息的容器。
      • NativeWebRequest:表示原生的 Web 请求,可以访问请求的详细信息。
      • WebDataBinderFactory:用于创建 WebDataBinder 的工厂,WebDataBinder 可以用于数据绑定和验证。
    • 返回值:解析后的方法参数值。

业务场景示例:

假设你正在开发一个 REST API,该 API 需要支持复杂的查询参数,例如一个包含多个搜索条件的自定义对象。

1. 创建自定义参数解析器:
import org.springframework.core.MethodParameter;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.context.request.ServletWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;

@Component
public class CustomSearchArgumentResolver implements HandlerMethodArgumentResolver {

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.getParameterType().isAssignableFrom(CustomSearchCriteria.class);
    }

    @Override
    public Object resolveArgument(
            MethodParameter parameter, ModelAndViewContainer mavContainer,
            NativeWebRequest webRequest, WebDataBinderFactory binderFactory) {

        CustomSearchCriteria searchCriteria = new CustomSearchCriteria();
        // 假设从请求中提取查询参数并填充到 searchCriteria
        ServletWebRequest request = (ServletWebRequest) webRequest;
        // ... 填充 searchCriteria 属性

        return searchCriteria;
    }
}
2. 注册自定义参数解析器:

在 Spring MVC 配置中注册你的自定义解析器:

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

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(new CustomSearchArgumentResolver());
    }
}
3. 使用自定义参数解析器:

在控制器中,你现在可以使用 CustomSearchCriteria 作为方法参数,它将自动被解析器处理:

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

@RestController
public class SearchController {

    @GetMapping("/search")
    public ResponseEntity<List<SearchResult>> search(CustomSearchCriteria criteria) {
        // 使用 criteria 执行搜索逻辑
        // ...
        return ResponseEntity.ok(searchResults);
    }
}

关键处理代码:

  • supportsParameter 方法用于确定参数解析器是否适用于特定的方法参数。
  • resolveArgument 方法是实际执行参数解析的地方,你可以根据 HTTP 请求中的信息来创建或填充参数对象。

目的:

  • HandlerMethodArgumentResolver 接口使得开发者能够自定义方法参数的解析方式,提供更灵活的数据绑定和验证机制。
  • 通过实现此接口,可以轻松地集成复杂的业务逻辑,如从请求中提取和转换数据,填充自定义对象等。
  • 使用 HandlerMethodArgumentResolver 可以提高代码的可维护性和可读性,同时集中处理参数解析逻辑。
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Solomon_肖哥弹架构

你的欣赏就是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值