什么时注解参数
说明 我们在 使用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){
}