Spring扩展之HandlerMethodArgumentResolver(自定义请求参数解析器)

作用

HandlerMethodArgumentResolver 是请求参数解析器,不管你是要获取Cookie中的值,Header中的值,JSON格式的数据,URI中的值,还是请求体中的数据,Spring都提供了相对应的参数解析器来提取参数。Spring默认提供了26中参数解析器,比如我们最常用的参数注解 @RequestParam 就是由 RequestParamMethodArgumentResolver 解析的,PathVariableMethodArgumentResolver 用来解析 @PathVariable 注解。
在这里插入图片描述

执行时机

参考SpringMVC源码解析“解析请求参数值”部分。

应用

这里我们来自定义一个参数解析器,实现为用户id自动赋值。

@RestController
@RequestMapping("/test")
public class TestController {

    @RequestMapping("/find")
    public String find(@UserId String userId) {
        System.out.println(userId);
        return "success";
    }
}

自定义一个注解@UserId,作用在userId参数上

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface UserId {
}

然后自定义一个参数解析器,实现 HandlerMethodArgumentResolver 接口

public class UserIdMethodArgumentResolver implements HandlerMethodArgumentResolver {

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        // 当参数上有@UserId时才使用该解析器解析
        return parameter.hasParameterAnnotation(UserId.class);
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
        // 假设从session中获取到了userId
        Object userId = webRequest.getAttribute("userId", NativeWebRequest.SCOPE_SESSION);
        if (userId == null) {
            throw new RuntimeException("非法调用");
        }
        return userId;
    }
}

最终我们需要将自定义的参数解析器注入到 RequestMappingHandlerAdapter 适配器的 customArgumentResolvers 的集合属性中。但是该适配器一般是由 <mvc:annotation-driven /> 标签帮我们自动注入的,所以需要在该标签里添加上自己的参数解析器

<mvc:annotation-driven>
  <mvc:argument-resolvers>
    <bean class="com.huangsz.springmvcdemo.LoginRequiredArgumentResolver"/>
  </mvc:argument-resolvers>
</mvc:annotation-driven>
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值