通过 HandlerMethodArgumentResolver 自定义入参类型

简介

调用接口时,有可能有能多参数,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);
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值