RequestParamMapMethodArgumentResolver
参数解析器,用于将 HTTP 请求的查询参数解析为一个 Map
类型的参数,这个参数可以被注入到控制器的方法中。这在处理包含多个查询参数的请求时非常有用,尤其是当这些参数不需要映射到一个明确的模型对象上时。文章源自灵鲨社区-https://www.0s52.com/bcjc/javajc/16107.html
类设计结构
文章源自灵鲨社区-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
解释
解释
解析核心代码:
- 支持参数判断:
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
属性为空。
- 判断参数是否是
- 参数解析:
java
复制代码@Override public Object resolveArgument(MethodParameter parameter, ..., NativeWebRequest webRequest) throws Exception { // 根据参数类型解析请求参数 if (MultiValueMap.class.isAssignableFrom(parameter.getParameterType())) { // 解析多值参数 } else { // 解析单值参数 } }
解释解释 - 处理多值参数:
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
类型的参数可以提高代码的可读性和可维护性,尤其是在处理复杂的查询逻辑时。
评论