使用参数注解获取登录用户,使你的代码更加优雅:
1、自定义注解需要实现解析器HandlerMethodArgumentResolver,实现两个方法。
@Component
@Slf4j
public class LoginUserHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {
@Autowired
private LoginService loginService;
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.getParameterType().isAssignableFrom(User.class) && parameter.hasParameterAnnotation(LoginUser.class);
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer container,NativeWebRequest request, WebDataBinderFactory factory) throws Exception {
Long cUserId=(Long) request.getAttribute(Constants.CURRENT_USER_ID,RequestAttributes.SCOPE_REQUEST);
if (cUserId>0) {
//从数据库中查询并返回
User user = loginService.getUserById(cUserId);
if(user == null) {
throw new RuntimeException(i18nService.getMessage("user.not.exist"));
}
return user;
}
}
}
2、设定User的实体类
@Data
public class User extends BaseObject {
private Integer id;
private String username;
private String mobile;
}
3、自定义注解LoginUser,设定Target使注解的作用目标范围为方法参数,设定Retention使注解的有效范围为(注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在)
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface LoginUser {
}
4、方法中直接通过注解使用登录用户信息
@PostMapping("saveServiceInfo")
public ResponseResult saveServiceInfo(@LoginUser User loginUser) {
// 直接可以使用LoginUser 注解获取人员信息
loginUser.getUsername();
}
5、参数注解完成,代码是不是显得比较优雅了。