RequestBodyAdvice和ResponseBodyAdvice


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的返回結果在輸出到響應之前做處理


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM