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

微信公衆號:

微信公衆號二維碼

相關文章
相關標籤/搜索