HandlerMethodArgumentResolver
的方法
HandlerMethodArgumentResolver
有两个方法,supportsParameter
和resolveArgument
。supportsParameter
方法返回布尔值,用来判断是否执行resolveArgument
方法,如果返回false
则不执行。resolveArgument
方法返回Object
,Object
就是解析参数最终得到的对象。
什么时候使用HandlerMethodArgumentResolver
- 当多个接口需要频繁处理请求中的参数时,可以使用
HandlerMethodArgumentResolver
统一处理。比如根据请求头中的token获取当前用户;或是需要将请求参数中的时间格式转换为时间戳。
实例
通过header
中的token
获取当前用户信息
-
创建自定义注解
/** * 自定义注解,通过注解获取当前用户 */ @Target({ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface UserInfo { }
-
创建参数解析器
/** * 通过请求头中的token获取用户信息的解析器 */ public class UserInfoMethodArgumentResolver implements HandlerMethodArgumentResolver { public UserInfoMethodArgumentResolver() { } @Override public boolean supportsParameter(MethodParameter parameter) { //如果有UserInfo注解,则执行resolveArgument if (parameter.hasParameterAnnotation(UserInfo.class)) { return true; } return false; } @Override public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { //获取用户登录凭证 String token = webRequest.getHeader("access-token"); //获取用户信息 SysUser sysUser = TokenUtils.getUserInfoByToken(token); return sysUser; } }
-
添加自定义参数解析器
@Configuration @AutoConfigureAfter public class MvcAdvanceConfig extends WebMvcConfigurationSupport { @Override public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) { //添加自定义参数解析器 argumentResolvers.add(new UserInfoMethodArgumentResolver()); super.addArgumentResolvers(argumentResolvers); } }
-
测试
controller
@RestController @RequestMapping(value = "/api/test") public class TestController { @GetMapping public String query(@UserInfo SysUser sysUser, @ApiDataParam("data") RequestApiData reqApiData) { System.out.println(sysUser.getUserName()); return "测试"; } }