zoukankan      html  css  js  c++  java
  • SpringBoot让你的Bean动起来(自定义参数解析HandlerMethodArgumentResolver)

    SpringBoot让你的Bean动起来(自定义参数解析HandlerMethodArgumentResolver)

    简介

    我们 Controller 用到的一些 Bean 需要通过一定的方式去获取的,可以通过注入方式获取其他获取方式进行获取。

    比如:需要用到用户实例,我们通常做法为下

    @Resource
    private UserService userService;
    
    @GetMapping("getUserByUsername")
    public String getUserByUsername(HttpServletRequest request) {
    
        ...
        AuthUser user = userService.getUserByUsername("小明");
        ...
    }
    

    这样是一般的做法,我们可以发现 HttpServletRequest 可以通过注入方式加载,也可以直接在 public String getUserByUsername() 方法参数获取到。

    这样的方式 也把我们的 User 对象封装到方法参数里。

    当我们执行 Controller 就会有一个对应用户的对象存在了。

    功能使用

    自定义 UserArgumentResolver

    这里我们需要使用到一个 HandlerMethodArgumentResolver 接口。

    自定义 UserArgumentResolver 处理 User

    /**
     * 封装 参数方式获取 {@link AuthUser} 对象
     *
     * @author purgeyao
     * @since 1.0
     */
    public class UserArgumentResolver implements HandlerMethodArgumentResolver {
    
      @Override
      public boolean supportsParameter(MethodParameter methodParameter) {
        Class<?> aClass = methodParameter.getParameterType();
        // 判断是否为 AuthUser 类
        return aClass == AuthUser.class;
      }
    
      @Override
      public Object resolveArgument(MethodParameter methodParameter,
          ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest,
          WebDataBinderFactory webDataBinderFactory) throws Exception {
    
        HttpServletRequest request = nativeWebRequest.getNativeRequest(HttpServletRequest.class);
    
        // 获取参数
        
        String name = request.getParameter("name");
    
        // TODO 获取对应的用户对象 查询操作
    
        AuthUser user = userService.getUserByUsername(name);
    
        return user;
      }
    }
    
    

    上述代码会在执行 Controller 之前处理。通过获取请求头 或者 请求里的参数(具体看自己的业务)。

    执行相应的对象查询操作。接下来就可以在 Controller 参数里可以方便使用了。

    Controller 方法参数使用

    @GetMapping("getUserByUsername")
    public String getUserByUsername(AuthUser user) {
        ...
        user.getAge();
        ...
    }
    

    总结

    上述介绍 HandlerMethodArgumentResolver 使用,原理请参考相关文章。

    示例代码地址:UserArgumentResolver

    作者GitHub:
    Purgeyao 欢迎关注

    qq交流群: 812321371 微信交流群: MercyYao

    微信公众号:

    微信公众号二维码

  • 相关阅读:
    快学scala习题解答--第五章 类
    从头认识java-18.2 主要的线程机制(2)-Executors的使用
    关于Bootstrap的理解
    Raw-OS源代码分析之idle任务
    Scilab 的画图函数(3)
    HDU2586.How far away ?——近期公共祖先(离线Tarjan)
    Codeforces Round #311 (Div. 2) A,B,C,D,E
    presto访问 Azure blob storage
    Presto集群安装配置
    Presto架构及原理
  • 原文地址:https://www.cnblogs.com/Purgeyao/p/11919396.html
Copyright © 2011-2022 走看看