springboot 參數注解 注入參數


什么時注解參數

說明 我們在 使用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){

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM