一、使用场景介绍
HandlerMethodArgumentResolver,中文称为方法参数解析器,是Spring Web(SpringMVC)组件中的众多解析器之一,主要用来对Controller中方法的参数进行处理。
在一般的接口调用场景下,每次调用Controller都需要检查请求中的token信息,并根据token还原用户信息,然后将用户信息封装到Controller的方法参数中,供方法中接下来的逻辑使用。
二、使用案例介绍
我们新建一个SpringBoot工程,用来实现获取请求中的token,还原为用户的信息,封装到Controller方法参数中。
@Data
public class User {
private String name;
private String gender;
private Integer age;
}
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface CurrentUser {
}
@Slf4j
@RestController
public class MyController {
@GetMapping("getMyHello")
public String getMyHello(@CurrentUser User currentUser){
log.info("current user info: {}", currentUser);
return "hello";
}
}
@Slf4j
@Component
public class CurrentUserResolver implements HandlerMethodArgumentResolver {
@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 {
User currentUser = new User();
if(User.class != parameter.getParameterType()){
log.error("入参用户类型不正确!");
return null;
}
// 请求header中有Authorization的值表示token,根据token解析出当前用户的信息
HttpServletRequest httpServletRequest = webRequest.getNativeRequest(HttpServletRequest.class);
String token = httpServletRequest.getHeader("Authorization");
// 如下模拟token的解析过程
if("123".equals(token)){
currentUser.setName("zhangsan");
currentUser.setGender("male");
currentUser.setAge(12);
}
return currentUser;
}
}
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Autowired
private CurrentUserResolver currentUserResolver;
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(currentUserResolver);
}
}
如上都是必须的内容,启动应用后,发起如下HTTP请求:
GET
http://localhost:8080/getMyHello
Head
Authorization=123
就能发现getMyHello
方法中的参数currentUser
被填充进去了。
三、其它解析器
除此之外,Spring还提供了其它有用的解析器,供特定场景下使用:
- 异常解析器,对捕获的异常进行解析处理;
- 视图解析器,将controller返回的string解析为一个视图地址;
- 类型转换解析器;
- 文件上传解析器;
- 等等其它;
网友评论