spring-mvc 之对返回值做通用处理

本文介绍了一种优化RESTful API返回值的方法,通过实现ResponseBodyAdvice接口,可以对ResponseObj中的expandParams字段进行过滤,确保敏感业务数据不会暴露给外部调用者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

业务场景:由于项目里面都使用通用的返回值,有些返回值涉及到业务,不想返回给接口调用者

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值