RequestParamMapMethodArgumentResolver 业务参数解析案例

零 Java教程评论77字数 2366阅读7分53秒阅读模式

RequestParamMapMethodArgumentResolver 业务参数解析案例

RequestParamMapMethodArgumentResolver 参数解析器,用于将 HTTP 请求的查询参数解析为一个 Map 类型的参数,这个参数可以被注入到控制器的方法中。这在处理包含多个查询参数的请求时非常有用,尤其是当这些参数不需要映射到一个明确的模型对象上时。文章源自灵鲨社区-https://www.0s52.com/bcjc/javajc/16107.html

类设计结构

image.png文章源自灵鲨社区-https://www.0s52.com/bcjc/javajc/16107.html

业务场景:

开发一个搜索引擎的 API,用户可以通过多个查询参数来定制搜索结果,例如按照日期范围、关键词、内容类型等进行搜索。文章源自灵鲨社区-https://www.0s52.com/bcjc/javajc/16107.html

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

java

复制代码
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 方法中。这样,你可以访问所有传递的查询参数,而不需要为每个参数单独声明一个方法参数。文章源自灵鲨社区-https://www.0s52.com/bcjc/javajc/16107.html

2. 搜索服务的实现:

java

复制代码
@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,然后根据这些参数执行搜索逻辑。文章源自灵鲨社区-https://www.0s52.com/bcjc/javajc/16107.html

3. 客户端请求:

客户端可以通过发送包含多个查询参数的 GET 请求来使用搜索引擎:文章源自灵鲨社区-https://www.0s52.com/bcjc/javajc/16107.html

txt

复制代码
GET /search?startDate=2023-01-01&endDate=2023-01-31&keyword=spring
解释
解释

解析核心代码:

  1. 支持参数判断

    java

    复制代码
    @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. 参数解析

    java

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

    Java

    复制代码
    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 类型的参数可以提高代码的可读性和可维护性,尤其是在处理复杂的查询逻辑时。
文章源自灵鲨社区-https://www.0s52.com/bcjc/javajc/16107.html文章源自灵鲨社区-https://www.0s52.com/bcjc/javajc/16107.html

零
  • 转载请务必保留本文链接:https://www.0s52.com/bcjc/javajc/16107.html
    本社区资源仅供用于学习和交流,请勿用于商业用途
    未经允许不得进行转载/复制/分享

发表评论