本文主要是介绍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;
}
-
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 {@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,解析请求头里的数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!