1.为何须要本身实现参数解析器java
咱们都知道在有注解的接口方法中加上@RequestBody等注解,springMVC会自动的将消息体等地方的里面参数解析映射到请求的方法参数中。web
若是咱们想要的信息不彻底是来自消息体等地方,好比说一部分是消息体,一部分是消息头,甚至一部分从配置中获取。这个时候咱们又但愿在方法入参进来就将这些信息组装好。或者说是须要从消息头里面去进行token解析认证的时候。spring
2. HandlerMethodArgumentResolver接口springboot
实现HandlerMethodArgumentResolver来扩展本身的参数解析器。该接口有两个方法supportsParameter和resolveArgument咱们须要重写这两个方法。app
supportsParameter是条件,只有这个方法返回true的时候。才会在调用resolveArgument方法进行参数解析。ide
Spring源码中对这两个方法的调用:spa
3.实现本身的参数解析器:3d
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.将本身的解析器加入到容器的解析器集合中code
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 */ @Component //必定要将本身的扩展类加到容器中 public class DefWebMvcConfigurer implements WebMvcConfigurer { public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) { resolvers.add(new DefArgumentResolver()); } }
固然也能够用注解的形式注入到DefWebMvcConfigurer 中在添加到集合中,同时还能够在DefArgumentResolver 中获取配置的信息。对象
5.Test
package com.nijunyang.springboot.argsresolver; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; /** * @author: create by nijunyang * @date:2019/11/30 */ @RestController public class Controller { @GetMapping("/test") public String test(User user){ return user.toString(); } }
6.效果:
直接能够获取到咱们自定返回的对象。