SpringMvc 自定义参数解析器HandlerMethodArgumentResolver的简单使用

HandlerMethodArgumentResolver作用

SpringMVC解析器用于解析request请求参数并绑定数据到Controller的入参上
有时候直接参数不是我们想要,可以自定义参数解析器转化为我们想要的参数。

实现
1.自定义一个类实现HandlerMethodArgumentResolver接口
接口说明:

  • supportsParameter:用于判定是否需要处理该参数分解,返回true为需要,并会去调用下面的方法resolveArgument。
  • resolveArgument:真正用于处理参数分解的方法,返回的Object就是controller方法上的形参对象。

public class UserArgumentResolver implements HandlerMethodArgumentResolver {
    /**
     * 参数为User时返回true
     * @param methodParameter
     * @return
     */
    @Override
    public boolean supportsParameter(MethodParameter methodParameter) {
        Class<?> clazz = methodParameter.getParameterType();
        return clazz== User.class;
        //或者搭配注解使用 自定义XXX注解
        //return parameter.hasParameterAnnotation(XXX.class);
    }

    /**
     * supportsParameter返回true时执行真正的逻辑代码
     * @param methodParameter
     * @param modelAndViewContainer
     * @param nativeWebRequest
     * @param webDataBinderFactory
     * @return
     * @throws Exception
     */
    @Override
    public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer,
                                  NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory)
                                throws Exception {

        //拿到HttpServletRequest对象
        HttpServletRequest request=nativeWebRequest.getNativeRequest(HttpServletRequest.class);

        //从request对象中拿到cookie 或者token
        //伪代码 通过登录态拿到user 返回user对象给到controller
        User user=User.getUser();
        return user;
    }
}

2.注册到WebMvcConfigurerAdapter中

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
    @Autowired
    UserArgumentResolver userArgumentResolver;
    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> list) {
        list.add(userArgumentResolver);
    }

}

3.在controller中使用,当方法参数中包含User参数便能通过HandlerMethodArgumentResolver 拿到对应user信息 返回user对象
场景:从前端拿到cookie时 通过cookie从后端拿到注册用户信息作为参数返回给到需要的函数,不用每当需要用户对象时,接口都写一次拿到cookie信息查库返回user。

 @RequestMapping("/test")
    @ResponseBody
    public String testTea(User user, @RequestBody Teacher teacher){
    //dosomething...
        return user.getName();
    }

或者搭配注解使用

  @RequestMapping(value = "/getAccount")
    @ResponseBody
   //自定义注解@getAccount搭配HandlerMethodArgumentResolver
    public String getAccountByOpenId(@getAccount String open) {
        return open;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值