@ControllerAdvice,ResponseBodyAdvice統合処理戻り値/応答体
7119 ワード
ResponseBodyAdviceはspring 4.1の新しい特性であり、その役割は応答体が書く前にいくつかの処理を行うことである.たとえば、戻り値の変更、暗号化などです.
私がプロジェクトで使用している@ControllerAdvice,ResponseBodyAdviceの目的は,各リクエストの戻りjsonに属性値を変更することである.
ResponseBodyAdviceインタフェースのソース:
実装例:
このようにして得られた処理済みの戻り値は、属性xxxの値がすべて「テスト修正戻り値」である.
私がプロジェクトで使用している@ControllerAdvice,ResponseBodyAdviceの目的は,各リクエストの戻りjsonに属性値を変更することである.
ResponseBodyAdviceインタフェースのソース:
package org.springframework.web.servlet.mvc.method.annotation;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
/**
* Allows customizing the response after the execution of an {@code @ResponseBody}
* or an {@code ResponseEntity} controller method but before the body is written
* with an {@code HttpMessageConverter}.
Implementations may be may be registered directly with
* {@code RequestMappingHandlerAdapter} and {@code ExceptionHandlerExceptionResolver}
* or more likely annotated with {@code @ControllerAdvice} in which case they
* will be auto-detected by both.
*
* @author Rossen Stoyanchev
* @since 4.1
*/
public interface ResponseBodyAdvice {
/**
* Whether this component supports the given controller method return type
* and the selected {@code HttpMessageConverter} type.
* @param returnType the return type
* @param converterType the selected converter type
* @return {@code true} if {@link #beforeBodyWrite} should be invoked, {@code false} otherwise
*/
boolean supports(MethodParameter returnType, Class> converterType);
/**
* Invoked after an {@code HttpMessageConverter} is selected and just before
* its write method is invoked.
* @param body the body to be written
* @param returnType the return type of the controller method
* @param selectedContentType the content type selected through content negotiation
* @param selectedConverterType the converter type selected to write to the response
* @param request the current request
* @param response the current response
* @return the body that was passed in or a modified, possibly new instance
*/
T beforeBodyWrite(T body, MethodParameter returnType, MediaType selectedContentType,
Class> selectedConverterType,
ServerHttpRequest request, ServerHttpResponse response);
}
実装例:
package com.xxx;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.http.server.ServletServerHttpRequest;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
import com.xxx.Messages;
/**
*
* @Description:TODO
* @author lh
* @time:2015-8-31 11:24:08
*/
@ControllerAdvice
public class MyResponseBodyAdvice implements ResponseBodyAdvice{
@Override
public Object beforeBodyWrite(Object returnValue, MethodParameter methodParameter,
MediaType mediaType, Class clas, ServerHttpRequest serverHttpRequest,
ServerHttpResponse serverHttpResponse) {
// ServerHttpRequest ServletServerHttpRequest HttpServletRequest
//ServletServerHttpRequest sshr=(ServletServerHttpRequest) serverHttpRequest;
// request ,
//HttpServletRequest request= sshr.getServletRequest();
// returnValue Message>
// Messages
Messages> msg=(Messages>) returnValue;
// /
msg.setXXX(" ");
//
return msg;
}
@Override
public boolean supports(MethodParameter methodParameter, Class clas) {
// controller
String methodName=methodParameter.getMethod().getName();
// /
String method= "loginCheck"; //
//
return !method.equals(methodName);
}
}
このようにして得られた処理済みの戻り値は、属性xxxの値がすべて「テスト修正戻り値」である.