当前位置:   article > 正文

HandlerMethodArgumentResolver(参数解析器)的作用+使用小案例

handlermethodargumentresolver

前言

今天在做项目时遇到了一个有关参数解析HandlerMethodArgumentResolver的使用疑惑。我想作为新手的我在此和大家一起交流并记录。接下来开始发车......

正文

 

首先先来认识一下这个接口,HandlerMethodArgumentResolver。

  1. public interface HandlerMethodArgumentResolver {
  2. boolean supportsParameter(MethodParameter var1);
  3. Object resolveArgument(MethodParameter var1, ModelAndViewContainer var2, NativeWebRequest var3, WebDataBinderFactory var4) throws Exception;
  4. }

大家可以看到,这个接口有两个方法,supportsParameter和resolveArgument。

方法supportsParameter很好理解,返回值是boolean类型,它的作用是判断Controller层中的参数,是否满足条件,满足条件则执行resolveArgument方法,不满足则跳过。

而resolveArgument方法呢,它只有在supportsParameter方法返回true的情况下才会被调用。用于处理一些业务,将返回值赋值给Controller层中的这个参数。

因此呢,我们可以将HandlerMethodArgumentResolver理解为是一个参数解析器,我们可以通过写一个类实现HandlerMethodArgumentResolver接口来实现对Controller层中方法参数的修改。

项目代码举例

未使用参数解析器时的Controller控制器:

  1. @Controller
  2. @RequestMapping("/goods")
  3. public class GoodsController {
  4. private static Logger logger = LoggerFactory.getLogger(GoodsController.class);
  5. @Autowired
  6. UserService userService;
  7. @RequestMapping("/to_list")
  8. public String to_login(Model model,HttpServletResponse response,
  9. @CookieValue(value=UserService.TOKEN,required = false)String cookieToken,
  10. @RequestParam(value = UserService.TOKEN,required = false) String paramToken) {
  11. if(StringUtils.isEmpty(cookieToken)&&StringUtils.isEmpty(paramToken)){
  12. return "login";
  13. }
  14. String token = StringUtils.isEmpty(cookieToken) ? paramToken : cookieToken;
  15. User user=userService.getByToken(response,token);
  16. logger.info(user.toString());
  17. model.addAttribute("user",user);
  18. return "goods_list";
  19. }
  20. }

请大家仔细看to_login方法的这两个参数  cookieToken和paramToken,再仔细看一下方法体。不难看出,这两个参数和方法体中的语句代码就是为了,通过cookie或request其中的token这一变量来查询用户user的信息。

但是大家发没发现,这一个方法,就为了简简单单的这一个小功能,就写了这么多代码。是不是有点过分臃肿呢?而且假如还有其他方法会用到用户user这一信息变量呢?

好的,这个时候我们就可以使用HandlerMethodArgumentResolver接口来进行一下小小的优化。

使用HandlerMethodArgumentResolver解析器后:

写一个类实现HandlerMethodArgumentResolver接口

  1. @Service
  2. public class UserArgumentResolver implements HandlerMethodArgumentResolver {
  3. @Autowired
  4. MiaoshaUserService userService;
  5. public boolean supportsParameter(MethodParameter parameter) {
  6. Class<?> clazz = parameter.getParameterType();
  7. return clazz==MiaoshaUser.class;
  8. }
  9. public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
  10. NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
  11. HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
  12. HttpServletResponse response = webRequest.getNativeResponse(HttpServletResponse.class);
  13. String paramToken = request.getParameter(MiaoshaUserService.COOKI_NAME_TOKEN);
  14. String cookieToken = getCookieValue(request, MiaoshaUserService.COOKI_NAME_TOKEN);
  15. if(StringUtils.isEmpty(cookieToken) && StringUtils.isEmpty(paramToken)) {
  16. return null;
  17. }
  18. String token = StringUtils.isEmpty(paramToken)?cookieToken:paramToken;
  19. return userService.getByToken(response, token);
  20. }
  21. private String getCookieValue(HttpServletRequest request, String cookiName) {
  22. Cookie[] cookies = request.getCookies();
  23. for(Cookie cookie : cookies) {
  24. if(cookie.getName().equals(cookiName)) {
  25. return cookie.getValue();
  26. }
  27. }
  28. return null;
  29. }
  30. }

把我们编写的这个类,注册到配置文件中去

  1. @Configuration
  2. public class WebConfig extends WebMvcConfigurerAdapter{
  3. @Autowired
  4. UserArgumentResolver userArgumentResolver;
  5. @Override
  6. public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
  7. argumentResolvers.add(userArgumentResolver);
  8. }
  9. }

最后,我们的控制类就可以这样写了

  1. @RequestMapping("/to_list")
  2. public String list(Model model,MiaoshaUser user) {
  3. model.addAttribute("user", user);
  4. //查询商品列表
  5. List<GoodsVo> goodsList = goodsService.listGoodsVo();
  6. model.addAttribute("goodsList", goodsList);
  7. return "goods_list";
  8. }

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/917064
推荐阅读
相关标签
  

闽ICP备14008679号