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);
}