springboot統(tǒng)一返回json數(shù)據(jù)格式并配置系統(tǒng)異常攔截方式
springboot統(tǒng)一返回json格式并配置系統(tǒng)異常攔截
通常進(jìn)行前后端分離開(kāi)發(fā)時(shí)我們需要定義統(tǒng)一的json數(shù)據(jù)交互格式并對(duì)系統(tǒng)未處理異常進(jìn)行處理。
以下具體介紹在springboot中的實(shí)現(xiàn)過(guò)程,通過(guò)該章節(jié)代碼可實(shí)現(xiàn)框架統(tǒng)一異常處理,并當(dāng)后臺(tái)接口反饋類(lèi)型不為統(tǒng)一格式時(shí)能夠進(jìn)行重新包裝成統(tǒng)一格式進(jìn)行返回。
具體實(shí)現(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、設(shè)置常用錯(cuò)誤碼
public class RtnCode { //正常返回 public static final String STATUS_OK = "000"; //參數(shù)錯(cuò)誤 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對(duì)象
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、設(shè)置bean過(guò)濾原則
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、實(shí)現(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);; } }
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot采用Dynamic-Datasource方式實(shí)現(xiàn)多JDBC數(shù)據(jù)源
在某些情況下,如果我們需要配置多個(gè)數(shù)據(jù)源,本文主要介紹了SpringBoot采用Dynamic-Datasource方式實(shí)現(xiàn)多JDBC數(shù)據(jù)源,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10intellij idea如何將web項(xiàng)目打成war包的實(shí)現(xiàn)
這篇文章主要介紹了intellij idea如何將web項(xiàng)目打成war包的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07RestTemplate如何添加請(qǐng)求頭headers和請(qǐng)求體body
這篇文章主要介紹了RestTemplate如何添加請(qǐng)求頭headers和請(qǐng)求體body問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07面試題:java中為什么foreach中不允許對(duì)元素進(jìn)行add和remove
讀者遇到了一個(gè)比較經(jīng)典的面試題,也就是標(biāo)題上說(shuō)的,為什么 foreach 中不允許對(duì)元素進(jìn)行 add 和 remove,本文就詳細(xì)的介紹一下,感興趣的可以了解一下2021-10-10SpringBoot使用jasypt加解密密碼的實(shí)現(xiàn)方法
這篇文章主要介紹了SpringBoot使用jasypt加解密密碼的實(shí)現(xiàn)方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10使用spring boot 整合kafka,延遲啟動(dòng)消費(fèi)者
這篇文章主要介紹了使用spring boot 整合kafka,延遲啟動(dòng)消費(fèi)者的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08