- SpringBoot2.x之HandlerMethodArgum
- SpringBoot2.x之HandlerMethodArgum
- SpringBoot2.x之HandlerMethodArgum
- SpringMVC常用接口之HandlerMethodArgum
- SpringBoot2.x—SpringCache(4)Spri
- SpringBoot2.x过滤器OncePerRequestFi
- SpringBoot2.x【八】集成Redis缓存
- 5.3-SpringBoot2.x实战整合Redis客户端+单元
- 5.2-新版SpringBoot2.5项目创建—小滴课堂学习笔记
- Spring Boot 2.0 常见问题总结(一)
@RequestBody正是依赖HandlerMethodArgumentResolver来生效的,我们也可以定义一些自定义的注解,来优化我们的项目。
注解 | 解析器类 |
---|---|
@RequestParam | RequestParamMethodArgumentResolver |
@PathVariable | PathVariableMethodArgumentResolver |
@RequestBody | RequestResponseBodyMethodProcessor |
@CookieValue | ServletCookieValueMethodArgumentResolver |
使用场景
例如以下这个例子,我们从Header中取得token数据,然后将token信息转化为用户信息。但是这一步操作可以在HandlerMethodArgumentResolver
来执行,在Controller的参数中获取到的就是用户信息。
1.1 自定义注解
/**
* 放在参数数,解析header里面的token读取为参数对象
*/
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface RequestToken {
}
1.2 解析器
/**
* 参数解析器
*/
public class UserInfoArgumentResolver implements HandlerMethodArgumentResolver {
private TokenService tokenService;
public UserInfoArgumentResolver(TokenService tokenService) {
this.tokenService = tokenService;
}
/**
* 是否校验参数,
* 1. 参数上有RequestToken注解;
* 2. 参数对象为{@link UserInfo};
* 若满足以上条件,则处理
* {@link UserInfoArgumentResolver#resolveArgument(MethodParameter, ModelAndViewContainer, NativeWebRequest, WebDataBinderFactory)}方法
*/
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.getParameterAnnotation(RequestToken.class) != null
&& UserInfo.class.isAssignableFrom(parameter.getParameterType());
}
/**
* 对参数的处理
* 1. 读取header里面的参数,去service中完成组装,然后返回出去
*/
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
HttpServletRequest nativeRequest = (HttpServletRequest) webRequest.getNativeRequest();
//在header里面获取参数
String token = nativeRequest.getHeader("token");
//去service中获取参数
return tokenService.getUserInfoByToken(token);
}
}
1.3 放入Spring容器中
@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {
@Autowired
private TokenService tokenService;
/**
* 设置参数转换器
*/
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(new UserInfoArgumentResolver(tokenService));
}
}
1.4 测试方法
@Slf4j
@RestController
public class SAOController {
@RequestMapping(value = "/sao/userInfo")
public String userInfo(@RequestToken UserInfo userInfo) {
return JSON.toJSONString(userInfo);
}
}
网友评论