springboot統(tǒng)一返回json數(shù)據(jù)格式并配置系統(tǒng)異常攔截方式
springboot統(tǒng)一返回json格式并配置系統(tǒng)異常攔截
通常進行前后端分離開發(fā)時我們需要定義統(tǒng)一的json數(shù)據(jù)交互格式并對系統(tǒng)未處理異常進行處理。
以下具體介紹在springboot中的實現(xiàn)過程,通過該章節(jié)代碼可實現(xiàn)框架統(tǒng)一異常處理,并當后臺接口反饋類型不為統(tǒng)一格式時能夠進行重新包裝成統(tǒng)一格式進行返回。
具體實現(xiàn)如下:
1、定義統(tǒng)一返回格式
public class RtnMsg{ private String rtnCode; private String rtnMsg=""; private Object msg; public RtnMsg(String rtnCode,String rtnMsg,Object msg){ this.rtnCode = rtnCode; this.rtnMsg = rtnMsg; this.msg = msg; } public RtnMsg(String rtnCode,String rtnMsg){ this.rtnCode = rtnCode; this.rtnMsg = rtnMsg; } public RtnMsg(){ } public String getRtnCode() { return rtnCode; } public void setRtnCode(String rtnCode) { this.rtnCode = rtnCode; } public String getRtnMsg() { return rtnMsg; } public void setRtnMsg(String rtnMsg) { this.rtnMsg = rtnMsg; } public Object getMsg() { return msg; } public void setMsg(Object msg) { this.msg = msg; } }
2、設置常用錯誤碼
public class RtnCode { //正常返回 public static final String STATUS_OK = "000"; //參數(shù)錯誤 public static final String STATUS_PARAM = "001"; //接口未發(fā)現(xiàn) public static final String STATUS_NOFOUND = "404"; //捕獲到異常 public static final String STATUS_SYSERROR = "500"; }
3、定義未處理異常統(tǒng)一攔截
import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; /** * @author suntongxin * Create on 2017年12月12日下午1:55:12 * All right reserved */ @ControllerAdvice public class CommExceptionHandler { @ResponseBody @ExceptionHandler(value = Exception.class) public RtnMsg handle(Exception e){ RtnMsg msg = new RtnMsg(RtnCode.STATUS_SYSERROR, "系統(tǒng)異常,異常原因:"+e.getMessage()); return msg; }
4、注入攔截response的bean對象
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * @author suntongxin * Create on 2017年12月12日下午1:55:27 * All right reserved */ @Configuration public class RtnMsgConfig{ @Bean public ResponseBodyWrapFactoryBean getResponseBodyWrap(){ return new ResponseBodyWrapFactoryBean(); } }
5、設置bean過濾原則
import java.util.ArrayList; import java.util.List; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.method.support.HandlerMethodReturnValueHandler; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter; import org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor; /** * @author suntongxin * Create on 2017年12月12日上午10:48:43 * All right reserved */ public class ResponseBodyWrapFactoryBean implements InitializingBean{ @Autowired private RequestMappingHandlerAdapter adapter; @Override public void afterPropertiesSet() throws Exception { List<HandlerMethodReturnValueHandler> returnValueHandlers = adapter.getReturnValueHandlers(); List<HandlerMethodReturnValueHandler> handlers = new ArrayList(returnValueHandlers); decorateHandlers(handlers); adapter.setReturnValueHandlers(handlers); } private void decorateHandlers(List<HandlerMethodReturnValueHandler> handlers){ for(HandlerMethodReturnValueHandler handler : handlers){ if(handler instanceof RequestResponseBodyMethodProcessor){ ResponseBodyWrapHandler decorator = new ResponseBodyWrapHandler(handler); int index = handlers.indexOf(handler); handlers.set(index, decorator); break; } } } }
6、實現(xiàn)具體的統(tǒng)一json返回處理
package cn.seisys.common; import org.springframework.core.MethodParameter; import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.method.support.HandlerMethodReturnValueHandler; import org.springframework.web.method.support.ModelAndViewContainer; /** * @author suntongxin * Create on 2017年12月12日上午10:48:54 * All right reserved */ public class ResponseBodyWrapHandler implements HandlerMethodReturnValueHandler{ private final HandlerMethodReturnValueHandler delegate; public ResponseBodyWrapHandler(HandlerMethodReturnValueHandler delegate){ this.delegate = delegate; } @Override public boolean supportsReturnType(MethodParameter returnType) { return delegate.supportsReturnType(returnType); } @Override public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception { RtnMsg rtnMsg = null; if(returnValue instanceof RtnMsg){ rtnMsg = (RtnMsg)returnValue; }else{ rtnMsg = new RtnMsg(RtnCode.STATUS_OK,"",returnValue); } delegate.handleReturnValue(rtnMsg, returnType, mavContainer, webRequest);; } }
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
SpringBoot采用Dynamic-Datasource方式實現(xiàn)多JDBC數(shù)據(jù)源
在某些情況下,如果我們需要配置多個數(shù)據(jù)源,本文主要介紹了SpringBoot采用Dynamic-Datasource方式實現(xiàn)多JDBC數(shù)據(jù)源,具有一定的參考價值,感興趣的可以了解一下2023-10-10intellij idea如何將web項目打成war包的實現(xiàn)
這篇文章主要介紹了intellij idea如何將web項目打成war包的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-07-07RestTemplate如何添加請求頭headers和請求體body
這篇文章主要介紹了RestTemplate如何添加請求頭headers和請求體body問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07面試題:java中為什么foreach中不允許對元素進行add和remove
讀者遇到了一個比較經典的面試題,也就是標題上說的,為什么 foreach 中不允許對元素進行 add 和 remove,本文就詳細的介紹一下,感興趣的可以了解一下2021-10-10SpringBoot使用jasypt加解密密碼的實現(xiàn)方法
這篇文章主要介紹了SpringBoot使用jasypt加解密密碼的實現(xiàn)方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10