自定义参数解析器(HandlerMethodArgumentResolver) 实现用户token解析
在项目中获取用户信息 会被频繁用到,那么怎么可以快速简洁的实现获取当前请求用户信息呢?
可以通过自定义注解实现,详情如下:
1.自定义注解:@Target({ElementType.PARAMETER}) 表明该注解作用于参数上。
@Target({ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) public @interface CurrentUser { boolean required() default false; }
2. 自定义解析器实现HandlerMethodArgumentResolver接口,包含两个接口
supportsParameter:用于判定是否需要处理该参数解析,返回true为需要,并会去调用下面的方法resolveArgument。
resolveArgument:用于处理参数分解的方法,返回的Object就是controller方法上的形参对象
public interface HandlerMethodArgumentResolver { boolean supportsParameter(MethodParameter parameter); @Nullable Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer, NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception; }
@Component @Slf4j public class UserMethodArgumentResolver implements HandlerMethodArgumentResolver { @Autowired private UserFeignApiService userFeignApiService; @Override public boolean supportsParameter(MethodParameter parameter) { return parameter.hasParameterAnnotation(CurrentUser.class); } @Override public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { String token = webRequest.getHeader("token"); if (parameter.getParameterAnnotation(CurrentUser.class).required()) { if (StringUtils.isBlank(token)) { throw new IllegalArgumentException("token不能为空"); } return userFeignApiService.getByToken(token); } if (StringUtils.isNotBlank(token)) { return userFeignApiService.getByToken(token); } return null; } }
3. 自定义方法解析 加入WeMvcConfigurer
@Configuration public class MvcConfig implements WebMvcConfigurer { @Autowired private UserMethodArgumentResolver userMethodArgumentResolver; @Override public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) { resolvers.add(userMethodArgumentResolver); WebMvcConfigurer.super.addArgumentResolvers(resolvers); } }
至此 ,我们就可以在接口参数上通过@CurrentUser 获取用户信息了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!