我是靠谱客的博主 强健高山,最近开发中收集的这篇文章主要介绍通过 HandlerMethodArgumentResolver 自定义入参类型,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

      • 简介
      • 代码
        • 自定义注解 @LoginUser
        • 自定义一个解析器LoginUserHandlerMethodArgumentResolver
      • 使用

简介

调用接口时,有可能有能多参数,Spring项目中就会定义很多的@RequestParam,让我们很抓毛。好在Spring 3.1开始提供的接口HandlerMethodArgumentResolver,实现此接口可以自定义对象,比如可以解析自定义的时间格式、自定义解析Map对象等这些spring原本不支持的对象格式。

代码

这一以一个Integer类型做例子。代码如下:

自定义注解 @LoginUser

LoginUser.java

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface LoginUser {

}

自定义一个解析器LoginUserHandlerMethodArgumentResolver

我们在解析器中返回一个固定的Object,实际情况是可以返回一个自定义对象。

LoginUserHandlerMethodArgumentResolver.java

public class LoginUserHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {
    public static final String LOGIN_TOKEN_KEY = "X-Litemall-Token";

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.getParameterType().isAssignableFrom(Integer.class) && parameter.hasParameterAnnotation(LoginUser.class);
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer container,
                                  NativeWebRequest request, WebDataBinderFactory factory) throws Exception {

//        return new Integer(1);
        String token = request.getHeader(LOGIN_TOKEN_KEY);
        if (token == null || token.isEmpty()) {
            return null;
        }

        return UserTokenManager.getUserId(token);
    }
}

其次还要将我们自己实现的WxWebMvcConfiguration加入到参数解析器集中,如下:

@Configuration
public class WxWebMvcConfiguration implements WebMvcConfigurer {
    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(new LoginUserHandlerMethodArgumentResolver());
    }
}

使用

在控制器中使用,@LoginUser Integer userId 可自动注入自定义的类型。

@GetMapping("list")
public Object list(@LoginUser Integer userId) {
    if (userId == null) {
        return ResponseUtil.unlogin();
    }
    List<LitemallAddress> addressList = addressService.queryByUid(userId);
    return ResponseUtil.okList(addressList);
}

最后

以上就是强健高山为你收集整理的通过 HandlerMethodArgumentResolver 自定义入参类型的全部内容,希望文章能够帮你解决通过 HandlerMethodArgumentResolver 自定义入参类型所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(60)

评论列表共有 0 条评论

立即
投稿
返回
顶部