您的位置:首页 > 产品设计 > UI/UE

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的返回结果在输出到响应之前做处理
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: