springmvc自定义参数解析器

springmvc自定义参数解析器

操作原理
1.当请求进入映射方法之后,发现映射方法声明的形式参数
2.springmvc马上遍历所有参数解析器(包括自定义解析器),一个一个执行supportParameter方法,
  一旦返回true,停止循环,表示当前解析器马上调用该解析器resolverArgument方法,
  将方法方法返回值注入到形式参数变量中
3.例子,假设映射方法声明一个UserInfo这个参数类型,springmvc执行时候,
  发现UserInfoArgumentResolver 解析的supportParameter方法返回true,
  那么再调用resolverArgument将当前登录用户信息返回直接注入到userinfo变量中
没用自定义解析器存在问题(代码重复)
存在问题:
	后端获取当前登录用户信息使用方法,其他接口要获取当前登录用户对象都需要执行几个步骤
	(先获取token,再通过token获取当前登录对象),出现代码重复
	//需求:使用简化的方式获取当前登录用户信息
		直接在请求映射方法中声明UserInfo,这个类型形式参数,springmvc就自动将当前登录用户对象注入
	//说明:
		springmvc所有的映射方法中形式参数的值注入都是靠springmvc自带参数解析器实现
	//具体操作:
	现在想要springmvc将当前登录用户对象注入,需要自定义参数解析器	
代码(UserArgumentResolver类,核心实现HandlerMethodArgumentResolver接口)
//实现HandlerMethodArgumentResolver接口中的2个方法
@Component
public class UserArgumentResolver implements HandlerMethodArgumentResolver {
    @Autowired
    private IUserInfoRedisService userInfoRedisService;
    //先判断参数类型和是否贴了自定义注解的,都满足就返回true,然后进行下一步获取数据
    @Override
    public boolean supportsParameter(MethodParameter methodParameter) {
        //判断类型,并且使用自定义注解限制
        return methodParameter.getParameterType() == UserInfo.class
         && methodParameter.hasParameterAnnotation(UserParameter.class);
    }
    //如果成功则再获取数据
    @Override
    public Object resolveArgument(MethodParameter methodParameter
                                  , ModelAndViewContainer modelAndViewContainer
                                  , NativeWebRequest nativeWebRequest
                                  , WebDataBinderFactory webDataBinderFactory) 
        throws Exception {
        //获取token
        String token = nativeWebRequest.getHeader("token");
        //获取用户对象
        UserInfo user = userInfoRedisService.getUserByToken(token);
        return user;
    }
}
1.将请求映射方法声明形式参数的UserInfo类型的参数,解析成当前登录用户对象并注入
	//方法1:用来匹配
	指定该解析器能解析参数类型,返回值为boolean类型,
	//方法2:执行解析逻辑,当上面判断是同一个类型时,就开始解析
	获取当前登录用户信息对象,并注入UserInfo类型的参数中,当前supportParameter() 返回true,才执行
		
2. 在主配置类中,将自定义参数解析器类交给spring容器管理,然后add,将我们自定义的解析器交给springmvc视图解析器
//注意:UserInfo.class类型要与需要封装的对象类型相同
主配置类(哪个服务需要用到自定义参数解析器,哪个服务就要配置这个,不一定是主配置了,只要实现WebMvcConfigurer接口即可)
//我们需要在主配置中将我们自定义的解析器交给springmvc管理
@SpringBootApplication
public class APP implements WebMvcConfigurer {
    @Autowired
    private UserArgumentResolver userArgumentResolver;

    public static void main(String[] args) {
        SpringApplication.run(APP.class, args);
    }
    //简写add,idea会提示该方法,将自定义参数解析器交给springmvc管理
    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
        resolvers.add(userArgumentResolver);
    }
}
自定义注解(防止都使用自定义注解,所以使用自定义注解来限制)
//如果要进行用户编辑,映射方法接受参数也是UserInfo,此时怎么区分,使用自定义注解区分
//表示贴在参数上
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
/*登录校验注解
        约定:如果该注解贴在某个参数上表示使用自定义解析器
        如果没有贴就使用springmvc的解析器*/
public @interface UserParameter {
}
验证

在这里插入图片描述

 //当我们需要获取登录用户信息时就贴上注解,这样获取的就是当前登录的,已经存到redis中的用户信息了
    @GetMapping("/info")
    public Object info(@UserParameter UserInfo userInfo) {
        return JsonResult.success(userInfo);
    }
//当我们不要当前登录用户信息,而是页面其他需要封装的信息时,我们就不贴注解,它会默认使用springmvc解析器帮我们进行封装
    //验证
    @GetMapping("/info2")
    public Object info2(UserInfo userInfo) {
        return JsonResult.success(userInfo);
    }
另一种 (获取cookie中的user对象)
public class UserArgumentresolver implements HandlerMethodArgumentResolver {
    @Autowired
    private RedisService redisService;

    @Override
    public boolean supportsParameter(MethodParameter methodParameter) {
        return methodParameter.getParameterType() == User.class
                && methodParameter.hasParameterAnnotation(ValidationAnno.class);
    }

    @Override
    public Object resolveArgument(MethodParameter methodParameter
    , ModelAndViewContainer modelAndViewContainer
    , NativeWebRequest nativeWebRequest
    , WebDataBinderFactory webDataBinderFactory) throws Exception {
        HttpServletRequest request = nativeWebRequest.getNativeRequest(HttpServletRequest.class);
        String token = CookieUtil.getToken(request, "userToken");
        User user = redisService.get(MemberKeyPrefix.USER_TOKEN, token, User.class);
        if (user != null) {
            return user;
        }
        return null;
    }
}
小结
springmvc自定义参数解析器可以让我们自定义的注入一些信息,例如:用户信息,开发中经常要获取用户信息,此时我们可以使用自定义参数解析器,然后配合自定义注解,让我们更加方便的获取到用户信息
步骤:
1.实现HandlerMethodArgumentResolver接口,一个方法判断类型,一个方法获取数据并返回
2.将自定义参数解析器交给springmvc管理即可
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值