SpringBoot自定义数据绑定handlermethodargumentresolver

今天在写项目代码的时候,有个接口类中要频繁用到登录的用户信息,这时候突然想到可以自定义注解对进行数据绑定,极大简洁代码,提高代码复用率,现在贴上代码具体实现。
首先自定义一个用于绑定信息的注解,这个注解只能放注解参数且运行时有效。

@Documented
@Inherited
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface HY {
   String value() default "";
}

按照定义,自定义一个UserResolver实现HandlerMethodArgumentResolver,在代码中通过cookie中的token去redis中获取用户的信息,这里无需判断redis是否存在信息,因为配置了拦截器保证了进到这里时用户是登录的。

/**
 * 用户信息
 */
public class UserResolver implements HandlerMethodArgumentResolver {
    @Override
    public boolean supportsParameter(MethodParameter methodParameter) {
        return methodParameter.hasParameterAnnotation(User.class);
    }

    @Override
    public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
        if (methodParameter.getParameterType().equals(UserInfoVO.class)) {
            Cookie[] cookies = nativeWebRequest.getNativeRequest(HttpServletRequest.class).getCookies();
            if (!ObjectUtils.isEmpty(cookies)) {
                for (Cookie cookie : cookies) {
                    if ("token".equals(cookie.getName())) {
                        String user = redisClient.get(cookie.getValue());
                        return gson.fromJson(user, UserInfoVO.class);
                    }
                }
            }
        }
        return null;
    }
}

WebMvcConfig中配置一下,让Spring去加载我们的类:

@Configuration
public class InterceptorConfig implements WebMvcConfigurer {

    private static Logger logger = LoggerFactory.getLogger(InterceptorConfig.class);

    @Resource
    HYArgumentsResolver hyArgumentsResolver;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(this.betIntercepter()).addPathPatterns("/api/bet", "/api/betG", "/api/bet/trace", "/api/sports/bet", "/api/live/play");
        registry.addInterceptor(this.requestLogInterceptor()).addPathPatterns("/**");
        registry.addInterceptor(this.loginInterceptor()).addPathPatterns("/api/**").excludePathPatterns("/api/config/getAll/analysis_api_host", "/api/recharge/onlinePayAsyncCallback/**/*", "/api/recharge/onlinePaySyncCallback/**/*", "/api/sports/loadResult", "/api/sports/message", "/api/sports/getNews", "/api/sports/getMaintenanceTime", "/api/recharge/deposit", "/api/payment/onlinePayAsyncCallback/**/*", "/api/sports/time", "/api/sports/getSportOnOff", "/api/fixedAsyncCallback/onlinePayAsyncCallback/**/*");
        registry.addInterceptor(this.userAgentResolverHandlerInterceptor());
    }

    @Bean
    public UserAgentResolverHandlerInterceptor userAgentResolverHandlerInterceptor() {
        return new UserAgentResolverHandlerInterceptor();
    }

    @Bean
    public BetIntercepter betIntercepter() {
        return new BetIntercepter();
    }

    @Bean
    public RequestLogInterceptor requestLogInterceptor() {
        return new RequestLogInterceptor();
    }

    @Bean
    public LoginInterceptor loginInterceptor() {
        return new LoginInterceptor();
    }


    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(hyArgumentsResolver);
    }

}

在接口中只要写上@HY UserInfo userInfo就可以实现自定义数据绑定啦。

 @ResponseBody
   public void personalReport(@HY UserInfo userInfo) {
      System.out.println(userInfo);
   }
发布了35 篇原创文章 · 获赞 1 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/u010494101/article/details/104673001