美文网首页
RequestParamMapMethodArgumentRes

RequestParamMapMethodArgumentRes

作者: 肖哥弹架构 | 来源:发表于2024-06-25 00:01 被阅读0次

    RequestParamMapMethodArgumentResolver 参数解析器,用于将 HTTP 请求的查询参数解析为一个 Map 类型的参数,这个参数可以被注入到控制器的方法中。这在处理包含多个查询参数的请求时非常有用,尤其是当这些参数不需要映射到一个明确的模型对象上时。

    类设计结构

    image.png

    业务场景:

    开发一个搜索引擎的 API,用户可以通过多个查询参数来定制搜索结果,例如按照日期范围、关键词、内容类型等进行搜索。

    1. 控制器方法使用 @RequestParam 注解:

    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class SearchController {
    
        @GetMapping("/search")
        public SearchResponse search(
                @RequestParam Map<String, String> allRequestParams) {
            // 使用 allRequestParams 中的参数执行搜索逻辑
            // 例如,解析日期范围、关键词等
            return searchService.performSearch(allRequestParams);
        }
    }
    

    在这个控制器中,@RequestParam 注解用于将所有请求参数作为一个 Map 注入到 search 方法中。这样,你可以访问所有传递的查询参数,而不需要为每个参数单独声明一个方法参数。

    2. 搜索服务的实现:

    @Service
    public class SearchService {
    
        public SearchResponse performSearch(Map<String, String> params) {
            // 根据 params 中的查询参数执行搜索
            // 例如,从 Map 中提取日期范围和关键词
            String startDate = params.get("startDate");
            String endDate = params.get("endDate");
            String keyword = params.get("keyword");
            
            // 执行搜索并返回结果
            // ...
            return new SearchResponse(/* ... */);
        }
    }
    

    在这个服务中,performSearch 方法接收一个包含所有查询参数的 Map,然后根据这些参数执行搜索逻辑。

    3. 客户端请求:

    客户端可以通过发送包含多个查询参数的 GET 请求来使用搜索引擎:

    GET /search?startDate=2023-01-01&endDate=2023-01-31&keyword=spring
    

    解析核心代码:

    1. 支持参数判断

      @Override
      public boolean supportsParameter(MethodParameter parameter) {
          RequestParam requestParam = parameter.getParameterAnnotation(RequestParam.class);
          return (requestParam != null && Map.class.isAssignableFrom(parameter.getParameterType()) &&
                  !StringUtils.hasText(requestParam.name()));
      }
      
      • 判断参数是否是 Map 类型,并且 @RequestParam 注解的 name 属性为空。
    2. 参数解析

      @Override
      public Object resolveArgument(MethodParameter parameter, ..., NativeWebRequest webRequest) throws Exception {
          // 根据参数类型解析请求参数
          if (MultiValueMap.class.isAssignableFrom(parameter.getParameterType())) {
              // 解析多值参数
          } else {
              // 解析单值参数
          }
      }
      
    3. 处理多值参数

      if (MultiValueMap.class.isAssignableFrom(parameter.getParameterType())) {
          Class<?> valueType = ...;
          if (valueType == MultipartFile.class) {
              // 处理文件上传
          } else if (valueType == Part.class) {
              // 处理多部分请求
          } else {
              // 处理普通多值参数
          }
      }else {
          Class<?> valueType = ...;
          if (valueType == MultipartFile.class) {
              // 处理单个文件上传
          } else if (valueType == Part.class) {
              // 处理单个请求部分
          } else {
              // 处理普通单值参数
          }
      }
      

    总结:

    • RequestParamMapMethodArgumentResolver 使得开发者能够轻松地处理包含多个查询参数的请求,而无需为每个参数单独声明一个方法参数。
    • 它提供了一种灵活的方式来访问和使用请求中的所有查询参数,使得编写通用和可重用的控制器方法变得更加简单。
    • 使用 @RequestParam 注解和 Map 类型的参数可以提高代码的可读性和可维护性,尤其是在处理复杂的查询逻辑时。

    相关文章

      网友评论

          本文标题:RequestParamMapMethodArgumentRes

          本文链接:https://www.haomeiwen.com/subject/auurcjtx.html