1、HandlerMethodArgumentResolver 简介

HandlerMethodArgumentResolver 是 SpringMVC 中的一个接口,它允许开发者在 SpringMVC 中支持自定义参数解析,它可以支持更多的参数类型,比如:HttpServletRequest、HttpServletResponse、HttpSession、Model 等,也可以支持自定义的参数类型,比如:自定义的对象类型。

2、HandlerMethodArgumentResolver 的作用

HandlerMethodArgumentResolver 的作用是帮助 SpringMVC 在处理请求的时候,把请求参数解析成 Controller 方法参数,从而实现 Controller 方法参数的自动注入。

HandlerMethodArgumentResolver 的作用主要是实现 Controller 方法参数的注入,SpringMVC 中的参数解析机制是通过 HandlerMethodArgumentResolver 的实现类来实现的,它可以支持更多的参数类型,比如:HttpServletRequest、HttpServletResponse、HttpSession、Model 等,也可以支持自定义的参数类型,比如:自定义的对象类型。

3、HandlerMethodArgumentResolver 的使用

使用 HandlerMethodArgumentResolver 需要实现 HandlerMethodArgumentResolver 接口,并实现其中的两个方法:supportsParameter() 和 resolveArgument()。

1234567891011121314151617181920
Java

public class MyHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {

       @Override

       public boolean supportsParameter(MethodParameter methodParameter) {

              // 判断参数类型是否是自定义的类型

              return methodParameter.getParameterType().isAssignableFrom(MyObject.class);

       }

       @Override

       public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {

              // 从请求中获取参数,并封装成自定义的对象

              MyObject myObject = new MyObject();

              String myParam = nativeWebRequest.getParameter("myParam");

              myObject.setMyParam(myParam);

              return myObject;

       }

}

实现完 HandlerMethodArgumentResolver 接口之后,还需要在 SpringMVC 的配置类中进行注册,以便 SpringMVC 可以使用它来解析请求参数:

12345678910
Java

@Configuration

public class WebMvcConfig implements WebMvcConfigurer {

       @Override

       public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {

              // 注册自定义的 HandlerMethodArgumentResolver

              argumentResolvers.add(new MyHandlerMethodArgumentResolver());

       }

}

这样,当 SpringMVC 处理请求的时候,就会使用自定义的 HandlerMethodArgumentResolver 来解析请求参数,从而实现 Controller 方法参数的自动注入。