Springboot使用参数解析器HandlerMethodArgumentResolver,解析请求头里的数据

本文主要是介绍Springboot使用参数解析器HandlerMethodArgumentResolver,解析请求头里的数据,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

HandlerMethodArgumentResolver 是 Spring MVC 中的一个接口,它允许你自定义方法参数的解析过程。当处理请求时,Spring MVC 需要将请求中的信息映射到控制器方法的参数上,而 HandlerMethodArgumentResolver 允许你在这个过程中进行自定义操作。

以下是关于 HandlerMethodArgumentResolver 的详细介绍:

接口定义

public interface HandlerMethodArgumentResolver {boolean supportsParameter(MethodParameter parameter);Object resolveArgument(MethodParameter parameter,ModelAndViewContainer mavContainer,NativeWebRequest webRequest,WebDataBinderFactory binderFactory) throws Exception;
}
  1. supportsParameter 方法

    • 该方法用于判断当前解析器是否支持给定的方法参数。
    • 如果返回 true,表示该解析器可以解析参数,否则返回 false
  2. resolveArgument 方法:

    • supportsParameter 返回 true 时,该方法将被调用,用于实际解析方法参数的值。
    • 它接收四个参数:
      • MethodParameter表示要解析的方法参数。
      • ModelAndViewContainer用于存储视图和模型数据的容器。
      • NativeWebRequest封装了底层的 ServletRequest ServletResponse
      • WebDataBinderFactory用于创建 WebDataBinder 实例的工厂。

使用场景:
自定义解析器通常用于从请求中提取数据,将其转换为控制器方法参数所需的类型。
常见的应用包括从请求头、Cookie、路径变量或请求参数中提取信息,以便在控制器方法中使用。

代码示例:

每次请求,获取请求头中的token信息,根据token自动获取用户User对象,以便在控制器方法中使用。

代码如下:

Token注解

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Token {String value() default "";
}

User类

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Builder
public class User {private Long userId;private String username;private String passworld;private String token;
}

TokenMethodArgumentResolver类

@Component
public class TokenMethodArgumentResolver implements HandlerMethodArgumentResolver {@Overridepublic boolean supportsParameter(MethodParameter parameter) {return parameter.hasParameterAnnotation(Token.class)?true:false;}@Overridepublic Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {if(parameter.getParameterAnnotation(Token.class) instanceof Token){String token = webRequest.getHeader("token");//解析token,获取useId,从数据库获缓存中获取用户User对象,这里模拟,这里简单写一下Long userId= 1L;User user = User.builder().userId(userId).username("admin").passworld("123456").token(token).build();return user;}return null;}
}

TokenWebMvcConfigurer配置类

@Configuration
public class TokenWebMvcConfigurer extends WebMvcConfigurationSupport {@AutowiredTokenMethodArgumentResolver tokenMethodArgumentResolver;public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {argumentResolvers.add(tokenMethodArgumentResolver);}//这段代码的作用是告诉 Spring MVC 如何处理以 "/swagger-ui/" 开头的请求路径,将其映射到 Swagger UI 的静态资源。这通常用于在应用中集成 Swagger,以便查看和测试 API 文档。@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/swagger-ui/**").addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/").resourceChain(false);}
}

控制层

@RestController
public class TestController {@GetMapping("/user/find")public User find(@Token User user){return user;}
}

ApiPost接口测试

这篇关于Springboot使用参数解析器HandlerMethodArgumentResolver,解析请求头里的数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/616895

相关文章

Spring三级缓存解决循环依赖的解析过程

《Spring三级缓存解决循环依赖的解析过程》:本文主要介绍Spring三级缓存解决循环依赖的解析过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、循环依赖场景二、三级缓存定义三、解决流程(以ServiceA和ServiceB为例)四、关键机制详解五、设计约

spring IOC的理解之原理和实现过程

《springIOC的理解之原理和实现过程》:本文主要介绍springIOC的理解之原理和实现过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、IoC 核心概念二、核心原理1. 容器架构2. 核心组件3. 工作流程三、关键实现机制1. Bean生命周期2.

史上最全nginx详细参数配置

《史上最全nginx详细参数配置》Nginx是一个轻量级高性能的HTTP和反向代理服务器,同时也是一个通用代理服务器(TCP/UDP/IMAP/POP3/SMTP),最初由俄罗斯人IgorSyso... 目录基本命令默认配置搭建站点根据文件类型设置过期时间禁止文件缓存防盗链静态文件压缩指定定错误页面跨域问题

Redis实现分布式锁全解析之从原理到实践过程

《Redis实现分布式锁全解析之从原理到实践过程》:本文主要介绍Redis实现分布式锁全解析之从原理到实践过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、背景介绍二、解决方案(一)使用 SETNX 命令(二)设置锁的过期时间(三)解决锁的误删问题(四)Re

解决tomcat启动时报Junit相关错误java.lang.ClassNotFoundException: org.junit.Test问题

《解决tomcat启动时报Junit相关错误java.lang.ClassNotFoundException:org.junit.Test问题》:本文主要介绍解决tomcat启动时报Junit相... 目录tomcat启动时报Junit相关错误Java.lang.ClassNotFoundException

Gradle下如何搭建SpringCloud分布式环境

《Gradle下如何搭建SpringCloud分布式环境》:本文主要介绍Gradle下如何搭建SpringCloud分布式环境问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Gradle下搭建SpringCloud分布式环境1.idea配置好gradle2.创建一个空的gr

JVM垃圾回收机制之GC解读

《JVM垃圾回收机制之GC解读》:本文主要介绍JVM垃圾回收机制之GC,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、死亡对象的判断算法1.1 引用计数算法1.2 可达性分析算法二、垃圾回收算法2.1 标记-清除算法2.2 复制算法2.3 标记-整理算法2.4

springboot集成Lucene的详细指南

《springboot集成Lucene的详细指南》这篇文章主要为大家详细介绍了springboot集成Lucene的详细指南,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起... 目录添加依赖创建配置类创建实体类创建索引服务类创建搜索服务类创建控制器类使用示例以下是 Spring

Java调用Python的四种方法小结

《Java调用Python的四种方法小结》在现代开发中,结合不同编程语言的优势往往能达到事半功倍的效果,本文将详细介绍四种在Java中调用Python的方法,并推荐一种最常用且实用的方法,希望对大家有... 目录一、在Java类中直接执行python语句二、在Java中直接调用Python脚本三、使用Run

使用Python开发Markdown兼容公式格式转换工具

《使用Python开发Markdown兼容公式格式转换工具》在技术写作中我们经常遇到公式格式问题,例如MathML无法显示,LaTeX格式错乱等,所以本文我们将使用Python开发Markdown兼容... 目录一、工具背景二、环境配置(Windows 10/11)1. 创建conda环境2. 获取XSLT