73.SpringBoot实现高逼格自动注入注解参数

文章目录

一、前言

环境:SpringBoot 2.1.5.RELEASE

需求:一些登录用户的信息每次都重复的需要反解token,怎样优雅的注解方式完成登录用户信息获取,利用HandlerMethodArgumentResolver实现注解实现参数注入和解析

二.定义注解和实体类

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoLoginInfo {
}

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoLoginInfo {
}

@Data
public class LoginInfo implements Serializable {
    private String userID;//用户ID
    private String clientType;//端类型
    private int lessonType;//课程类型
}

@Data
public class UserInfo  implements Serializable{
    private int lessonNum;
    private String classID;
    private String clientType;
}

三.拦截器实现解析

@Component
public class ActionArgumentResolver implements HandlerMethodArgumentResolver {
    
    @Override
    public boolean supportsParameter(MethodParameter methodParameter) {
        Annotation[] annotations = methodParameter.getParameterAnnotations();
        return Stream.of(annotations).allMatch(item ->
                AutoUserInfo.class.isInstance(item) ||
                        AutoLoginInfo.class.isInstance(item)

        );
    }

  
    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
        HttpServletRequest servletRequest = webRequest.getNativeRequest(HttpServletRequest.class);
        Annotation[] annotations = parameter.getParameterAnnotations();
        for (Annotation annotation : annotations) {
            if (AutoUserInfo.class.isInstance(annotation)) {
                //todo  jwt的操作
                UserInfo userInfo =new UserInfo();
                userInfo.setClassID("666");
                userInfo.setLessonNum(1);
                userInfo.setClientType("ios");
                return userInfo;
            } else if (AutoLoginInfo.class.isInstance(annotation)) {
                LoginInfo loginInfo =new LoginInfo();
                loginInfo.setUserID("888");
                loginInfo.setLessonType(1);
                loginInfo.setClientType("安卓");
                return loginInfo;
            }

            }

        return null;
    }
}

@Configuration
public class MyWebMvcConfigurer implements WebMvcConfigurer {
    @Autowired
    private AuthInterceptor authInterceptor;
    /*进行反注解参数*/
    @Autowired
    private ActionArgumentResolver actionArgumentResolver;

//    @Override
//    public void addInterceptors(InterceptorRegistry registry) {
//        registry.addInterceptor(authInterceptor).addPathPatterns("/**").excludePathPatterns("/login").excludePathPatterns("/error");
//
//    }
    @Override
    public void addArgumentResolvers(List argumentResolvers) {
        argumentResolvers.add(actionArgumentResolver);
    }

}

四.完成调用

 @GetMapping("car")
    @MetricMethodCost(description ="my test")
    public Car getMyCar(@AutoLoginInfo LoginInfo loginInfo, @AutoUserInfo UserInfo userInfo) {
        System.out.println(loginInfo);
        System.out.println(userInfo);
        return carService.getCar();
    }
展开阅读全文

页面更新:2024-04-25

标签:注解   参数   用户信息   前言   优雅   定义   需求   类型   课程   操作   方式   环境   目录   用户   文章   科技

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top