1.为什么需要自己实现参数解析器

我们都知道在有注解的接口方法中加上@RequestBody等注解,springMVC会自动的将消息体等地方的里面参数解析映射到请求的方法参数中。

如果我们想要的信息不完全是来自消息体等地方,比如说一部分是消息体,一部分是消息头,甚至一部分从配置中获取。这个时候我们又希望在方法入参进来就将这些信息组装好。或者说是需要从消息头里面去进行token解析认证的时候。

2. HandlerMethodArgumentResolver接口

实现HandlerMethodArgumentResolver来扩展自己的参数解析器。该接口有两个方法supportsParameter和resolveArgument我们需要重写这两个方法。

 

 

 

supportsParameter是条件,只有这个方法返回true的时候。才会在调用resolveArgument方法进行参数解析。

Spring源码中对这两个方法的调用:

 

 

 

3.实现自己的参数解析器:

 

复制代码
package com.nijunyang.springboot.argsresolver;  import org.springframework.core.MethodParameter; import org.springframework.lang.Nullable; 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;  import javax.servlet.http.HttpServletRequest;  /**  * @author: create by nijunyang  * @date:2019/11/30  */public class DefArgumentResolver implements HandlerMethodArgumentResolver {     @Override     public boolean supportsParameter(MethodParameter methodParameter) {         //方法参数是User 则使用此解析器        return User.class.isAssignableFrom(methodParameter.getParameterType());     }      @Nullable     @Override     public Object resolveArgument(             MethodParameter methodParameter,             @Nullable ModelAndViewContainer modelAndViewContainer,             NativeWebRequest nativeWebRequest,             @Nullable WebDataBinderFactory webDataBinderFactory) throws Exception {         HttpServletRequest servletRequest = nativeWebRequest.getNativeRequest(HttpServletRequest.class);         String info = (String) nativeWebRequest.getAttribute("params", NativeWebRequest.SCOPE_REQUEST);         //获取消息头认证信息,没有后续操作了,根据业务实际来解析校验该token        String token = servletRequest.getHeader("Authorization");         //自己塞数据进去,也可以从配置文件获取数据        return new User("zhangsan",18);       } }
复制代码

 

4.将自己的解析器加入到容器的解析器集合中

复制代码
package com.nijunyang.springboot.argsresolver;  import org.springframework.stereotype.Component; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;  import java.util.List;  /**  * @author: create by nijunyang  * @date:2019/11/30  <