WebArgumentResolver
spring-boot session
java系統(tǒng)開發(fā)的時候,相信大家都需要獲取當(dāng)前登錄用戶,用來記錄操作員等。
而平時我們極有可能用的這種辦法: request.getSession().getAttribute("CURRENT_USER")
比如以前保存資源是這樣的:
@RequestMapping(value = "save.json", method = RequestMethod.POST)
@ResponseBody
public String saveResource(HttpServletRequest request, Resource res){
// 這里的res,是從頁面表單提交過來的
// 這里的res里面,可能需要記錄操作人,那么需要獲取到當(dāng)前用戶
CurrentUser currentUser = request.getSession().getAttribute("CURRENT_USER");
}
這里我們需要寫:request.getSession().getAttribute("CURRENT_USER");
這沒有任何問題,但是能否這一句代碼都不寫,直接進入這個方法就把CURRENT_USER注入好了?
比如進入下面這個方法時,框架能否注入了當(dāng)前用戶CurrentUser ?yes,請繼續(xù)看下面。
@RequestMapping(value = "save.json", method = RequestMethod.POST)
@ResponseBody
public String saveResource(CurrentUser user, Resource res){
}
開工:
1. 自定義ArgumentResolver實現(xiàn)WebArgumentResolver接口
源碼如下:
public class CurrentUserArgumentResolver implements WebArgumentResolver {
@Override
public Object resolveArgument(MethodParameter methodParameter, NativeWebRequest webRequest) {
if(methodParameter.getParameterType() != null
&& methodParameter.getParameterType().equals(CurrentUser.class)){
// 判斷controller方法參數(shù)有沒有寫當(dāng)前用戶,如果有,這里返回即可,通常我們從session里面取出來
HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
Object currentUser = request.getSession().getAttribute("CURRENT_USER");
return currentUser;
}
return UNRESOLVED;
}
}
2. 配置<mvc:annotation-driven>
<mvc:annotation-driven>
<mvc:argument-resolvers>
<bean class="com.xxx.CurrentUserArgumentResolver" />
</mvc:argument-resolvers>
</mvc:annotation-driven>
這里的com.xxx.CurrentUserArgumentResolver就是上面寫的CurrentUserArgumentResolver路徑
3. 測試
@RequestMapping(value = "save.json", method = RequestMethod.POST)
@ResponseBody
public String saveResource(CurrentUser user, Resource res){
// 這里的res,是從頁面表單提交過來的
// 看看這里的user,是不是已經(jīng)有值了?
System.out.println(user);
}
ok,是不是發(fā)現(xiàn)這個小招可以寫到自己的框架里面呢