spring boot

SpringBoot自定义数据绑定handlermethodar

2018-09-12  本文已影响350人  春苟哈皮

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

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

按照定义,自定义一个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 WebMvcConfig extends WebMvcConfigurerAdapter {
    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(userResolver());
    }

    @Bean
    public UserResolver userResolver() {
        return new UserResolver();
    }
}

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

@RequestMapping(value = "getUser", method = RequestMethod.GET)
public Map<String, Object> versionBack( @User UserInfoVO userInfo) {
    System.out.println(userInfo);
}
上一篇下一篇

猜你喜欢

热点阅读