有的时候会好奇@RequestBody、@RequestParam注解是怎么获取方法的,今天学习之后尝试使用一下。
首先需要明确的是在SpringMVC自带了很多参数解析器:
上面只是其中一部分。
所以显然我们下面要做的就是自定义解析器,并加入到执行器中去
- 首先第一步,完成我们需要的注解
两个注解表示作用在参数上,运行期有效。
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyToken {
}
- 创建解析器
创建只需要实现HandlerMethodArgumentResolver 接口,重写两个方法,
supportsParameter方法表示判断参数上是否有该注解,
resolveArgument表示返回解析之后的结果,参数列表里已经给到了大多数我们可能用到的
public class TokenArgumentResolver implements HandlerMethodArgumentResolver {
//看是否支持某个注解
@Override
public boolean supportsParameter(MethodParameter parameter) {
MyToken token = parameter.getParameterAnnotation(MyToken.class);
return token != null;
}
//解析参数
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
//返回请求头中的token
return webRequest.getHeader("token");
}
}
- 加入到参数解析器
@Configuration
@ComponentScan
public class Config{
@Bean
public RequestMappingHandlerAdapter RequestMappingHandlerAdapter(){
//获取执行器
RequestMappingHandlerAdapter handlerAdapter = new RequestMappingHandlerAdapter();
TokenArgumentResolver tokenArgumentResolver = new TokenArgumentResolver();
List handlerMethodArgumentResolvers = new ArrayList<>();
handlerMethodArgumentResolvers.add(tokenArgumentResolver);
//加入自定义的Token解析器
handlerAdapter.setCustomArgumentResolvers(handlerMethodArgumentResolvers);
return handlerAdapter;
}
}
至此,配置已经完成!我们可以用自定义的@Token注解了
测试用ajax发送携带token的请求:
后台写一个controller接受
@PostMapping("/test3")
@ResponseBody
public String test3(@MyToken String token,HttpServletRequest request) {
if(token == null){
log.info("无");
}else {
log.info("token值:"+token);
}
log.info("test3({})", token);
return token;
}
运行结果:
至此,就完成了参数解析器的实现。
黑马



