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 "测试"; } }