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

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

简介

咱们 Controller 用到的一些 Bean 须要经过必定的方式去获取的,能够经过注入方式获取其余获取方式进行获取。java

好比:须要用到用户实例,咱们一般作法为下git

@Resource
private UserService userService;

@GetMapping("getUserByUsername")
public String getUserByUsername(HttpServletRequest request) {

    ...
    AuthUser user = userService.getUserByUsername("小明");
    ...
}

这样是通常的作法,咱们能够发现 HttpServletRequest 能够经过注入方式加载,也能够直接在 public String getUserByUsername() 方法参数获取到。github

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

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

功能使用

自定义 UserArgumentResolver

这里咱们须要使用到一个 HandlerMethodArgumentResolver 接口。springboot

自定义 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 以前处理。经过获取请求头 或者 请求里的参数(具体看本身的业务)。app

执行相应的对象查询操做。接下来就能够在 Controller 参数里能够方便使用了。ide

Controller 方法参数使用

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

总结

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

示例代码地址:UserArgumentResolver

做者GitHub:
Purgeyao 欢迎关注

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

微信公众号:

微信公众号二维码

相关文章
相关标签/搜索