什么時注解參數
說明 我們在 使用spring mvc 的時候會使用這樣的注解 @ResponseBody 這樣,spring mvc 會將 客戶端傳來的數據,自動構建成 相應類型的對象。
有些情況下我們 獲取當前登錄人 ,我們也可以使用注解參數。
實現代碼
比如 我們寫這樣的一個方法:
public void getUser(@LoginUser User user){
}
添加一個注解類
@Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface LoginUser { /** * 是否查詢SysUser對象所有信息,true則通過rpc接口查詢 */ boolean isFull() default false; }
增加一個參數解析類
public class TokenArgumentResolver implements HandlerMethodArgumentResolver { private RemoteUserService userService; public TokenArgumentResolver(RemoteUserService userService) { this.userService = userService; } /** * 入參篩選 * * @param methodParameter 參數集合 * @return 格式化后的參數 */ @Override public boolean supportsParameter(MethodParameter methodParameter) { return methodParameter.hasParameterAnnotation(LoginUser.class) && methodParameter.getParameterType().equals(JPaasUser.class); } /** * @param methodParameter 入參集合 * @param modelAndViewContainer model 和 view * @param nativeWebRequest web相關 * @param webDataBinderFactory 入參解析 * @return 包裝對象 */ @Override public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) { LoginUser loginUser = methodParameter.getParameterAnnotation(LoginUser.class); boolean isFull = loginUser.isFull(); HttpServletRequest request = nativeWebRequest.getNativeRequest(HttpServletRequest.class); String userId = request.getHeader(SecurityConstants.USER_ID_HEADER); String username = request.getHeader(SecurityConstants.USER_HEADER); String roles = request.getHeader(SecurityConstants.ROLE_HEADER); if (StrUtil.isBlank(username)) { log.warn("resolveArgument error username is empty"); return null; } User user; if (isFull) { user = userService.selectByUsername(username); } else { user = new User(); user.setUserId(userId); user.setAccount(username); } return user; } }
這個代碼會從請求上下文獲取數據並構建上下文用戶對象。
在 mvc 配置中增加這個參數解析類。
public class DefaultWebMvcConfig extends WebMvcConfigurationSupport { @Lazy @Autowired private RemoteUserService userService; /** * Token參數解析 * * @param argumentResolvers 解析類 */ @Override public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) { //注入用戶信息 argumentResolvers.add(new TokenArgumentResolver(userService)); //注入應用信息 argumentResolvers.add(new ClientArgumentResolver()); }
這樣就可以就可以在參數中直接使用以下代碼獲取上下文用戶了。
public void getUser(@LoginUser User user){
}