美文网首页
SpringBoot2.x之HandlerMethodArgum

SpringBoot2.x之HandlerMethodArgum

作者: 小胖学编程 | 来源:发表于2021-11-18 15:41 被阅读0次

@RequestBody正是依赖HandlerMethodArgumentResolver来生效的,我们也可以定义一些自定义的注解,来优化我们的项目。

注解 解析器类
@RequestParam RequestParamMethodArgumentResolver
@PathVariable PathVariableMethodArgumentResolver
@RequestBody RequestResponseBodyMethodProcessor
@CookieValue ServletCookieValueMethodArgumentResolver

使用场景

例如以下这个例子,我们从Header中取得token数据,然后将token信息转化为用户信息。但是这一步操作可以在HandlerMethodArgumentResolver来执行,在Controller的参数中获取到的就是用户信息。

1.1 自定义注解

/**
 * 放在参数数,解析header里面的token读取为参数对象
 */
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface RequestToken {
}

1.2 解析器

/**
 * 参数解析器
 */
public class UserInfoArgumentResolver implements HandlerMethodArgumentResolver {

    private TokenService tokenService;

    public UserInfoArgumentResolver(TokenService tokenService) {
        this.tokenService = tokenService;
    }

    /**
     * 是否校验参数,
     * 1. 参数上有RequestToken注解;
     * 2. 参数对象为{@link UserInfo};
     * 若满足以上条件,则处理
     * {@link UserInfoArgumentResolver#resolveArgument(MethodParameter, ModelAndViewContainer, NativeWebRequest, WebDataBinderFactory)}方法
     */
    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.getParameterAnnotation(RequestToken.class) != null
                && UserInfo.class.isAssignableFrom(parameter.getParameterType());
    }

    /**
     * 对参数的处理
     * 1. 读取header里面的参数,去service中完成组装,然后返回出去
     */
    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
            NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
        HttpServletRequest nativeRequest = (HttpServletRequest) webRequest.getNativeRequest();
        //在header里面获取参数
        String token = nativeRequest.getHeader("token");
        //去service中获取参数
        return tokenService.getUserInfoByToken(token);
    }
}

1.3 放入Spring容器中

@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {

    @Autowired
    private TokenService tokenService;

    /**
     * 设置参数转换器
     */
    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
        resolvers.add(new UserInfoArgumentResolver(tokenService));
    }

}

1.4 测试方法

@Slf4j
@RestController
public class SAOController {
    @RequestMapping(value = "/sao/userInfo")
    public String userInfo(@RequestToken UserInfo userInfo) {
        return JSON.toJSONString(userInfo);
    }
}

相关文章

网友评论

      本文标题:SpringBoot2.x之HandlerMethodArgum

      本文链接:https://www.haomeiwen.com/subject/hvodtrtx.html