此文主要表明两点:
①熟悉SpringBoot的RequestMappingHandlerAdapter 。
②自定义实现参数验证以及参数封装 重新自定义自己的@ResponBody注解,自定义注解的写法。
工欲善其事必先利其器,一个好的架构能够让代码写起来更为简洁,让程序实现起来更加方便。
注释:网上的文章很多,可以自己去搜索,这里就不做详细的解释。
注解的 基本机制有点类似于java的反射,概念性的东西请自行百度,这里只讲怎么去实现。
实现@MyRequestBody,和@MyResponBody
//也许有人会问 为什么不直接改写@RespnBody, 我觉得 这应该是没是找事干的感觉,除了能强行装逼之外毫无意义,你不知道你改写后以后会出现什么问题。
代码:
/** * Created by reasahi on 2017/6/16. */ @Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface MyRequestBody { }
//MyResponBody
/** * Created by reasahi on 2017/6/16. */ @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface MyResponseBody { }
//如何自定义,怎样让Spring 认识他,怎么加入代码块
SpringBoot 以spring为起点而产生的框架,贯穿于Spring的DispatcherServlet 作为web的请求处理类,既然我们选择要重新定义自己的 请求和返还类 那么 有必要了解一下DispatcherServlet,在很久之前的SSH 框架中 Action 交给struts2 进行处理请求和返还统一管理 。而Spring的DispatcherServlet则是接收WebApplicationContext和ServletConfig进行必要参数的初始化,service方法,是处理请求的入口,接受request和response参数
既然知道了这点那么想要实现自己的参数解析,参数返还那么就简单多了。
RequestMappingHandlerAdapter是其中一个典型的例子,这个类包含HandlerMethodArgumentResolver,HandlerMethodReturnValueHandler的一些实现类来处理RequestMapping的参数和返回值。
private HandlerMethodArgumentResolverComposite argumentResolvers;
private HandlerMethodReturnValueHandlerComposite returnValueHandlers;
RequestResponseBodyMethodProcessor是HandlerAdapter的内部一个重要的类,这个类同时实现了HandlerMethodArgumentResolver,HandlerMethodReturnValueHandler。
其中HandlerMethodArgumentResolver接口有两个方法。
public interface HandlerMethodArgumentResolver {
boolean supportsParameter(MethodParameter parameter);
Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception;
}
HandlerMethodReturnValueHandler接口同样也有两个方法。
public interface HandlerMethodReturnValueHandler {
boolean supportsReturnType(MethodParameter returnType);
void handleReturnValue(Object returnValue, MethodParameter returnType,
ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception;
}
所以从RequestResponseBodyMethodProcessor实现的方法,就可以看出来这个类,会处理被@RequestBody注解的参数,和@ResponseBody注解的返回值。
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.hasParameterAnnotation(RequestBody.class);
}
@Override
public boolean supportsReturnType(MethodParameter returnType) {
return (AnnotationUtils.findAnnotation(returnType.getContainingClass(), ResponseBody.class) != null ||
returnType.getMethodAnnotation(ResponseBody.class) != null);
}
接下来就介绍一下自定义ResponseBody和RequestBody的使用方法。
配置一个Bean
/** * Created by reasahi on 2017/6/16. */ @Configuration public class MyWebMvcConfigurationSupport extends WebMvcConfigurationSupport { @Bean public RequestMappingHandlerAdapter requestMappingHandlerAdapter() { RequestMappingHandlerAdapter requestMappingHandlerAdapter = super.requestMappingHandlerAdapter(); List<HttpMessageConverter<?>> converters = new ArrayList<HttpMessageConverter<?>>(); converters.add(new DataMessageConvert()); List<HandlerMethodArgumentResolver> argumentResolvers = new ArrayList<HandlerMethodArgumentResolver>(); argumentResolvers.add(new MyResolver(converters)); requestMappingHandlerAdapter.setCustomArgumentResolvers(argumentResolvers); List<HandlerMethodReturnValueHandler> returnValueHandlers = new ArrayList<HandlerMethodReturnValueHandler>(); returnValueHandlers.add(new MyResolver(converters)); requestMappingHandlerAdapter.setCustomReturnValueHandlers(returnValueHandlers); return requestMappingHandlerAdapter; } }
剩下的就是去实现中间我们定义的 MyResolver(converters);
我这里写了一个demo 实现 参数验证,数据返还过多的看代码,文章辅助理解;
git 地址http://git.oschina.net/reasahi/springBootInterface
下一篇写 统一配置