HandlerMethodArgumentResolver 方法参数自动封装设计方案
HandlerMethodArgumentResolver
为解析控制器方法参数的核心设计。它允许开发者介入方法参数的解析过程,实现自定义的参数绑定逻辑。以下是接口方法的详细说明和业务场景示例:
接口方法说明:
-
supportsParameter:
- 作用:判断当前的
HandlerMethodArgumentResolver
实现是否支持解析给定的MethodParameter
。 - 参数:
MethodParameter
类型的参数,表示控制器方法中的参数。 - 返回值:如果参数被支持,则返回
true
。
- 作用:判断当前的
-
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
可以提高代码的可维护性和可读性,同时集中处理参数解析逻辑。
转载自:https://juejin.cn/post/7381348425925017638