HandlerMethodArgumentResolver方法参数解析器的使用

一、使用场景介绍

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 resolvers) {
        resolvers.add(currentUserResolver);
    }
}

如上都是必须的内容,启动应用后,发起如下HTTP请求:

GET
http://localhost:8080/getMyHello
Head
Authorization=123

就能发现getMyHello方法中的参数currentUser被填充进去了。

三、其它解析器

除此之外,Spring还提供了其它有用的解析器,供特定场景下使用:

  • 异常解析器,对捕获的异常进行解析处理;
  • 视图解析器,将controller返回的string解析为一个视图地址;
  • 类型转换解析器;
  • 文件上传解析器;
  • 等等其它;

四、参考文档

SpringMVC中各种解析器_lc1062657810的博客-CSDN博客_spring 解析器

你可能感兴趣的:(HandlerMethodArgumentResolver方法参数解析器的使用)