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

简介: HandlerMethodArgumentResolver 是 Spring MVC 中的一个接口,它允许你自定义方法参数的解析过程。当处理请求时,Spring MVC 需要将请求中的信息映射到控制器方法的参数上,而 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;
}


supportsParameter 方法:


该方法用于判断当前解析器是否支持给定的方法参数。

如果返回 true,表示该解析器可以解析参数,否则返回 false。

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 {
    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.hasParameterAnnotation(Token.class)?true:false;
    }
    @Override
    public 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 {
    @Autowired
    TokenMethodArgumentResolver tokenMethodArgumentResolver;
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(tokenMethodArgumentResolver);
    }


   //这段代码的作用是告诉 Spring MVC 如何处理以 "/swagger-ui/" 开头的请求路径,将其映射到 Swagger UI 的静态资源。这通常用于在应用中集成 Swagger,以便查看和测试 API 文档。

@Override
    public 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接口测试


相关文章
|
1天前
|
Java Spring 容器
SpringBoot自动装配原理之@Import注解解析
SpringBoot自动装配原理之@Import注解解析
|
1天前
|
canal 缓存 关系型数据库
Spring Boot整合canal实现数据一致性解决方案解析-部署+实战
Spring Boot整合canal实现数据一致性解决方案解析-部署+实战
|
4天前
|
JSON Java Maven
Javaweb之SpringBootWeb案例之 SpringBoot原理的详细解析
Javaweb之SpringBootWeb案例之 SpringBoot原理的详细解析
8 0
Javaweb之SpringBootWeb案例之 SpringBoot原理的详细解析
|
4天前
|
存储 Java 程序员
SpringBoot之分层解耦以及 IOC&DI的详细解析
SpringBoot之分层解耦以及 IOC&DI的详细解析
8 0
|
4天前
|
前端开发 Java
SpringBoot之三层架构的详细解析
SpringBoot之三层架构的详细解析
20 0
|
17天前
|
Java Linux
Springboot 解决linux服务器下获取不到项目Resources下资源
Springboot 解决linux服务器下获取不到项目Resources下资源
|
25天前
|
Java API Spring
SpringBoot项目调用HTTP接口5种方式你了解多少?
SpringBoot项目调用HTTP接口5种方式你了解多少?
79 2
|
25天前
|
前端开发 JavaScript Java
6个SpringBoot 项目拿来就可以学习项目经验接私活
6个SpringBoot 项目拿来就可以学习项目经验接私活
34 0
|
1月前
|
前端开发 Java 关系型数据库
SpringBoot+MyBatis 天猫商城项目
SpringBoot+MyBatis 天猫商城项目
57 1
|
28天前
|
Java Maven 微服务
springboot项目开启远程调试-jar包
springboot项目开启远程调试-jar包
20 0

推荐镜像

更多