业务场景:由于项目里面都使用通用的返回值,有些返回值涉及到业务,不想返回给接口调用者
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到接口调用者了!