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;
}