RequestBodyAdvice和ResponseBodyAdvice
2016-03-28 15:41
686 查看
RequestBodyAdvice和ResponseBodyAdvice
这是spring 4.2新加的两个接口,这两个接口有些什么作用呢?先看看这两个接口RequestBodyAdvice
public interface RequestBodyAdvice { boolean supports(MethodParameter methodParameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType); Object handleEmptyBody(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType); HttpInputMessage beforeBodyRead(HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) throws IOException; Object afterBodyRead(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType); }
查看一下谁调用了这个接口的这些方法,可以看到AbstractMessageConverterMethodArgumentResolver的readWithMessageConverters()方法调用了这个接口的方法。
//代码片段 for (HttpMessageConverter<?> converter : this.messageConverters) { Class<HttpMessageConverter<?>> converterType = (Class<HttpMessageConverter<?>>) converter.getClass(); if (converter instanceof GenericHttpMessageConverter) { GenericHttpMessageConverter<?> genericConverter = (GenericHttpMessageConverter<?>) converter; if (genericConverter.canRead(targetType, contextClass, contentType)) { if (logger.isDebugEnabled()) { logger.debug("Read [" + targetType + "] as \"" + contentType + "\" with [" + converter + "]"); } if (inputMessage.getBody() != null) { inputMessage = getAdvice().beforeBodyRead(inputMessage, param, targetType, converterType); body = genericConverter.read(targetType, contextClass, inputMessage); body = getAdvice().afterBodyRead(body, inputMessage, param, targetType, converterType); } else { body = null; body = getAdvice().handleEmptyBody(body, inputMessage, param, targetType, converterType); } break; } }
可以看到这接口的方法,主要是在HttpMessageConverter处理request body的前后做一些处理,和body为空的时候做处理。
而AbstractMessageConverterMethodArgumentResolver的实现类有
HttpEntityMethodProcessor(处理controller的方法参数是HttpEntity或RequestEntity的)、
RequestResponseBodyMethodProcessor(处理方法参数有@RequestBoyd的)、
RequestPartMethodArgumentResolver(处理方法参数是@RequestPart或MultipartFile,javax.servlet.http.Part)。
从这个可以看出,我们可以在使用这些HandlerMethodArgumentResolver的时候,我们能对request body进行前处理,和解析后处理。
RequestBodyAdvice怎么用
首先一个实现类,实现RequestBodyAdvice,后在类上加上注解@ControllerAdvice,比如有些请求的参数需要做加密处理,可以在此将json串解密处理,在处理ResponseBodyAdvice
public interface ResponseBodyAdvice<T> { boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType); T beforeBodyWrite(T body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response); }
此可以对@ResponseBody的返回结果在输出到响应之前做处理
相关文章推荐
- leetcode 300. Longest Increasing Subsequence
- UI控件--ViewPager详解添加标题栏(3)
- UIView动画(过渡效果)的学习笔记
- easyui datagrid里的toobar按钮隐藏、显示、禁用等方式的实现
- NGUI 层次
- easyui datagrid 让某行复选框置灰不能选
- Your build settings specify a provisioning profile with the UUID, no provisioning profile was
- uitabbaritem 图片居中
- AJAX XMLHttpRequest对象详解
- requests上传文件
- UINavigationController 基础篇
- php中include_once,require_once,和include,require的使用场景和区别。
- Java中容器[Collection(List,Set,Queue),Map],迭代器(Iterator)和比较器(Comparator)及列表排序
- iOS继承UITableViewController的视图控制器不执行代理方法
- UILabel attributedText
- UVA 10534 Wavio Sequence 【LIS】
- 深入Java集合系列之五:PriorityQueue
- 解决在ubuntu下requests 无法找到模块packages
- UIImage设置渲染模式
- UIView扩展--方便控件的布局