業務場景:由于項目裡面都使用通用的傳回值,有些傳回值涉及到業務,不想傳回給接口調用者
public class ResponseObj {
public static final String SUCCESS_CODE = "40000";//成功後傳回
public static final String PARAM_ERROR_CODE = "50001";//參數錯誤後的傳回碼
public static final String DEFAULT_ERROR_CODE = "50000";//參數錯誤後的預設傳回碼
public static final String CONNECTIONTIMEOUT = "50002";//參數錯誤後的傳回碼,連接配接逾時
public static final String USER_NO_LOGIN = "50003";//針對使用者未登陸的錯誤碼
public static final String INVALID_TOKEN = "52001";
public static final String NO_AUTH = "60000";//沒權限
private String msg; //傳回資訊
private Object data;//傳回資料
private String msgCode;//狀态碼
private Integer errCount;//錯誤次數
private List<Map<String,Object>> expandParams;
public Integer getErrCount() {
return errCount;
}
public void setErrCount(Integer errCount) {
this.errCount = errCount;
}
public ResponseObj() {
super();
}
public ResponseObj(Object data, String msgCode) {
super();
this.data = data;
this.msgCode = msgCode;
}
public String getMsg() {
return msg;
}
public ResponseObj setMsg(String msg) {
this.msg = msg;
return this;
}
public Object getData() {
return data;
}
public ResponseObj setData(Object data) {
this.data = data;
return this;
}
public String getMsgCode() {
return MyFormat.isStrNull(msgCode) ? DEFAULT_ERROR_CODE : msgCode;
}
public ResponseObj setMsgCode(String msgCode) {
this.msgCode = msgCode;
return this;
}
public List<Map<String, Object>> getExpandParams() {
return expandParams;
}
public ResponseObj setExpandParams(List<Map<String, Object>> expandParams) {
this.expandParams = expandParams;
return this;
}
/**
* @param obj 傳回的資料
* @param msg 傳回的描述資訊(不填寫則為成功)
* **/
public static ResponseObj returnSuccess(Object obj,String msg) {
return new ResponseObj().setMsg(msg).setData(obj).setMsgCode(SUCCESS_CODE);
}
/**
* @param obj 傳回的資料
* @param msgCode 錯誤編碼,不填寫則為50000
* @param msg 傳回的描述資訊(不填寫則為系統錯誤)
* **/
public static ResponseObj returnError(Object obj,String msgCode,String msg){
if(MyFormat.isStrNull(msgCode))
msgCode = DEFAULT_ERROR_CODE;
if(MyFormat.isStrNull(msg))
msg = "系統錯誤";
return new ResponseObj().setMsg(msg).setData(obj).setMsgCode(msgCode);
}
/**
* @param msg 傳回的描述資訊(不填寫則為系統錯誤) msgCode 為預設50000
* **/
public static ResponseObj returnError(String msg){
return returnError(null,null,msg);
}
public static ResponseObj returnNoLogin(){
return returnError(null,USER_NO_LOGIN,"沒有登入");
}
public static ResponseObj returnNoAuth(){
return returnError(null,NO_AUTH,"沒有權限");
}
}
以上是我們項目中接口約定的傳回對象,某些情況下我們會使用expandParams,做一些業務處理。不希望這個參數傳回給接口調用者。
這個時候實作接口 ResponseBodyAdvice,對傳回值做通用處理。
@ControllerAdvice
public class MyResponseBodyAdvice implements ResponseBodyAdvice<Object> {
@Override
public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
return true;
}
@Override
public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
if(o instanceof ResponseObj) {
((ResponseObj) o).setExpandParams(null);
}
return o;
}
}
以上代碼可以看出,實作beforeBodyWrite這個方法,對傳回值進行了修改!這樣就不會傳回expandParams到接口調用者了!