HandlerMethodArgumentResolver
是 Spring 框架中的一个重要接口,主要用于处理控制器方法参数的解析。在 Spring MVC 中,当一个请求到达控制器方法时,Spring 需要将请求中的数据(如请求参数、请求头、请求体等)转换为控制器方法所需要的参数类型,HandlerMethodArgumentResolver
就负责完成这个转换过程。
接口定义
HandlerMethodArgumentResolver
接口定义如下:
public interface HandlerMethodArgumentResolver {
/**
* 判断当前解析器是否支持解析指定的方法参数
* @param parameter 要检查的方法参数
* @return 如果支持解析则返回 true,否则返回 false
*/
boolean supportsParameter(MethodParameter parameter);
/**
* 解析方法参数的值
* @param parameter 要解析的方法参数
* @param mavContainer 当前请求的 ModelAndViewContainer
* @param webRequest 当前请求
* @param binderFactory 用于创建 WebDataBinder 的工厂
* @return 解析后的参数值
* @throws Exception 如果解析过程中出现异常
*/
Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception;
}
主要方法说明
supportsParameter(MethodParameter parameter)
:该方法用于判断当前解析器是否支持解析指定的方法参数。如果返回true
,则 Spring 会调用resolveArgument
方法进行参数解析;如果返回false
,则会尝试使用其他解析器。resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory)
:当supportsParameter
方法返回true
时,Spring 会调用该方法进行参数解析。该方法需要返回解析后的参数值。
使用步骤
以下是使用 HandlerMethodArgumentResolver
的一般步骤:
1. 创建自定义解析器
创建一个类实现 HandlerMethodArgumentResolver
接口,并实现其两个方法。
import org.springframework.core.MethodParameter;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;
public class CustomArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
// 判断是否支持解析该参数类型
return parameter.getParameterType().equals(CustomObject.class);
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
// 解析参数逻辑
CustomObject customObject = new CustomObject();
// 从请求中获取数据并设置到 customObject 中
String value = webRequest.getParameter("key");
customObject.setValue(value);
return customObject;
}
}
2. 注册自定义解析器
将自定义解析器注册到 Spring MVC 中,可以通过实现 WebMvcConfigurer
接口来完成。
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.List;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(new CustomArgumentResolver());
}
}
3. 在控制器方法中使用自定义参数类型
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MyController {
@GetMapping("/test")
public String test(CustomObject customObject) {
return "Received: " + customObject.getValue();
}
}
常见应用场景
- 自定义请求参数解析:当 Spring 自带的参数解析器无法满足需求时,可以自定义解析器来处理特定类型的请求参数。
- 用户信息注入:在控制器方法中自动注入当前登录用户的信息,避免在每个方法中手动获取用户信息。
- 请求头信息解析:将请求头中的信息解析为控制器方法的参数。
除非注明,否则均为李锋镝的博客原创文章,转载必须以链接形式标明本文链接