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