springboot 参数注解 注入参数

2021-01-28 04:14

阅读:793

标签:view   contain   添加   The   应用信息   autowired   获取   bind   应用   

什么时注解参数

说明 我们在 使用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 argumentResolvers) {
        //注入用户信息
        argumentResolvers.add(new TokenArgumentResolver(userService));
        //注入应用信息
        argumentResolvers.add(new ClientArgumentResolver());
    }

这样就可以就可以在参数中直接使用以下代码获取上下文用户了。

public void getUser(@LoginUser User user){

}

 

springboot 参数注解 注入参数

标签:view   contain   添加   The   应用信息   autowired   获取   bind   应用   

原文地址:https://www.cnblogs.com/yg_zhang/p/12841300.html


评论


亲,登录后才可以留言!