SpringMvc 自定義參數解析器HandlerMethodArgumentResolver的簡單使用

HandlerMethodArgumentResolver作用

SpringMVC解析器用於解析request請求參數並綁定數據到Controller的入參上
有時候直接參數不是我們想要,可以自定義參數解析器轉化爲我們想要的參數。

實現
1.自定義一個類實現HandlerMethodArgumentResolver接口
接口說明:

  • supportsParameter:用於判定是否需要處理該參數分解,返回true爲需要,並會去調用下面的方法resolveArgument。
  • resolveArgument:真正用於處理參數分解的方法,返回的Object就是controller方法上的形參對象。

public class UserArgumentResolver implements HandlerMethodArgumentResolver {
    /**
     * 參數爲User時返回true
     * @param methodParameter
     * @return
     */
    @Override
    public boolean supportsParameter(MethodParameter methodParameter) {
        Class<?> clazz = methodParameter.getParameterType();
        return clazz== User.class;
        //或者搭配註解使用 自定義XXX註解
        //return parameter.hasParameterAnnotation(XXX.class);
    }

    /**
     * supportsParameter返回true時執行真正的邏輯代碼
     * @param methodParameter
     * @param modelAndViewContainer
     * @param nativeWebRequest
     * @param webDataBinderFactory
     * @return
     * @throws Exception
     */
    @Override
    public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer,
                                  NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory)
                                throws Exception {

        //拿到HttpServletRequest對象
        HttpServletRequest request=nativeWebRequest.getNativeRequest(HttpServletRequest.class);

        //從request對象中拿到cookie 或者token
        //僞代碼 通過登錄態拿到user 返回user對象給到controller
        User user=User.getUser();
        return user;
    }
}

2.註冊到WebMvcConfigurerAdapter中

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
    @Autowired
    UserArgumentResolver userArgumentResolver;
    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> list) {
        list.add(userArgumentResolver);
    }

}

3.在controller中使用,當方法參數中包含User參數便能通過HandlerMethodArgumentResolver 拿到對應user信息 返回user對象
場景:從前端拿到cookie時 通過cookie從後端拿到註冊用戶信息作爲參數返回給到需要的函數,不用每當需要用戶對象時,接口都寫一次拿到cookie信息查庫返回user。

 @RequestMapping("/test")
    @ResponseBody
    public String testTea(User user, @RequestBody Teacher teacher){
    //dosomething...
        return user.getName();
    }

或者搭配註解使用

  @RequestMapping(value = "/getAccount")
    @ResponseBody
   //自定義註解@getAccount搭配HandlerMethodArgumentResolver
    public String getAccountByOpenId(@getAccount String open) {
        return open;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章