天天看點

spring-mvc 之對傳回值做通用處理

業務場景:由于項目裡面都使用通用的傳回值,有些傳回值涉及到業務,不想傳回給接口調用者

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到接口調用者了!