此文主要代表两点:java
①熟悉SpringBoot的RequestMappingHandlerAdapter 。git
②自定义实现参数验证以及参数封装 从新自定义本身的@ResponBody注解,自定义注解的写法。web
工欲善其事必先利其器,一个好的架构可以让代码写起来更为简洁,让程序实现起来更加方便。spring
注释:网上的文章不少,能够本身去搜索,这里就不作详细的解释。架构
注解的 基本机制有点相似于java的反射,概念性的东西请自行百度,这里只讲怎么去实现。app
实现@MyRequestBody,和@MyResponBody框架
//也许有人会问 为何不直接改写@RespnBody, 我以为 这应该是没是找事干的感受,除了能强行装逼以外毫无心义,你不知道你改写后之后会出现什么问题。ide
代码:spa
/** * Created by reasahi on 2017/6/16. */ @Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface MyRequestBody { }
//MyResponBody.net
/** * 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
下一篇写 统一配置