SpringBoot統(tǒng)一功能處理的方式詳解
基于SpringAOP已經(jīng)實(shí)現(xiàn)統(tǒng)一功能增強(qiáng),但如果希望對(duì)Controller增強(qiáng),就無法獲取其中的http請(qǐng)求數(shù)據(jù)。因此,實(shí)現(xiàn)以下這些統(tǒng)一增強(qiáng)的業(yè)務(wù),就不能使用SpringAOP:
- 響應(yīng)數(shù)據(jù)統(tǒng)一封裝
- 統(tǒng)一異常處理(返回錯(cuò)誤信息的http響應(yīng))
- http請(qǐng)求日志記錄
SpringMVC統(tǒng)一處理的三種方式
SpringMVC在SpringBoot項(xiàng)目中,是默認(rèn)進(jìn)行了配置,同時(shí)也提供了自定義的配置方式。
1、基于SpringMVC的配置類擴(kuò)展
如:
(1)添加路徑前綴
@Override public void configurePathMatch(PathMatchConfigurer configurer) { //對(duì)Controller中的路徑,添加前綴 //需要注意:添加前綴后,之后進(jìn)行資源訪問也需要添加前綴 //第一個(gè)參數(shù):要添加的前綴,第二個(gè)參數(shù):用于鍋爐Controller中的方法 configurer.addPathPrefix("api",(c)->true); }
(2)添加攔截器
添加Controller的方法攔截器=>對(duì)請(qǐng)求映射方法進(jìn)行統(tǒng)一增強(qiáng)。
web開發(fā)中的三大組件:過濾器、攔截器、監(jiān)聽器。
攔截器:
對(duì)web請(qǐng)求和響應(yīng)進(jìn)行攔截,然后可以統(tǒng)一處理;
Spring中,包含兩種攔截器:
- HandlerInterceptor:專門做SpringMVC請(qǐng)求和響應(yīng)的攔截;
- MethodInterceptor:對(duì)方法進(jìn)行攔截,是SpringAOP的一種實(shí)現(xiàn)。
攔截器的實(shí)現(xiàn)原理:
HandlerInterceptor的實(shí)現(xiàn)原理:SpringMVC是基于框架實(shí)現(xiàn)了一個(gè)頂級(jí)的Servlet:DispatcherServlet,里面封裝了很多邏輯,其中包括HandlerInterceptor的邏輯。是基于代碼設(shè)計(jì)上的實(shí)現(xiàn)=>不是動(dòng)態(tài)代理?。?!
MethodInterceptor實(shí)現(xiàn)原理:基于動(dòng)態(tài)代理。
2、統(tǒng)一的響應(yīng)數(shù)據(jù)格式封裝
使用@ControllerAdvice+ResponseBodyAdvice的方式實(shí)現(xiàn)。
import org.springframework.core.MethodParameter; import org.springframework.http.MediaType; import org.springframework.http.server.ServerHttpRequest; import org.springframework.http.server.ServerHttpResponse; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; import java.util.HashMap; import java.util.Map; @ControllerAdvice //注解是對(duì)Controller進(jìn)行增強(qiáng)(SpringMVC代碼設(shè)計(jì)) public class ResponseAdvice implements ResponseBodyAdvice { //方法的返回值表示是否要對(duì)請(qǐng)求映射方法增強(qiáng) //兩個(gè)方法參數(shù),可以篩選controller中的請(qǐng)求映射方法 @Override public boolean supports(MethodParameter returnType, Class converterType) { return false; } //增強(qiáng)的邏輯:http返回的響應(yīng),基于方法的返回值來設(shè)置響應(yīng)體body //第一個(gè)方法參數(shù)body,是請(qǐng)求映射方法的返回值 //調(diào)用登錄接口,返回map對(duì)象(ok=false,msg=xxx),就是body方法參數(shù) @Override public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) { //構(gòu)造一個(gè)統(tǒng)一的返回格式 Map<String,Object> map =new HashMap<>(); map.put("success",true); map.put("data",body); return map; } }
3、統(tǒng)一異常處理
Controller請(qǐng)求映射方法,如果拋異常,由統(tǒng)一異常處理的代碼來執(zhí)行。
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpServletResponse; import java.util.HashMap; //統(tǒng)一異常處理 @Controller public class ExceptionAdvice { //使用@ExceptionHandler注解,可以設(shè)置要補(bǔ)貨的Controller請(qǐng)求映射方法拋出的異常類 @ExceptionHandler(Exception.class) //方法的寫法,和Controller請(qǐng)求映射方法的寫法類似 //如果返回json就使用@ResponseBody,如果返回網(wǎng)頁,就返回資源路徑的字符串 @ResponseBody public Object handle(Exception e, HttpServletResponse){ HashMap<String, Object> map= new HashMap<>(); map.put("success", 0); map.put("status", 1); map.put("msg", e.getMessage()); return map; } }
到此這篇關(guān)于SpringBoot統(tǒng)一功能處理的方式詳解的文章就介紹到這了,更多相關(guān)SpringBoot統(tǒng)一功能處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mybatis中foreach標(biāo)簽帶來的空格\換行\(zhòng)回車問題及解決方案
這篇文章主要介紹了解決Mybatis中foreach標(biāo)簽帶來的空格,換行,回車問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04mybatis plus自動(dòng)生成代碼tinyint(1)自動(dòng)轉(zhuǎn)換為Boolean的問題及解決
這篇文章主要介紹了mybatis plus自動(dòng)生成代碼tinyint(1)自動(dòng)轉(zhuǎn)換為Boolean的問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08Java中this,static,final,const用法詳解
這篇文章主要介紹了Java中this,static,final,const用法詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07SpringBoot項(xiàng)目集成日志的實(shí)現(xiàn)方法
這篇文章主要介紹了SpringBoot項(xiàng)目集成日志的實(shí)現(xiàn)方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-02-02SpringBoot項(xiàng)目集成依賴Mybatis步驟
在本篇文章中小編給大家分享了關(guān)于SpringBoot項(xiàng)目如何集成依賴Mybatis的相關(guān)知識(shí)點(diǎn)內(nèi)容,有興趣的朋友們學(xué)習(xí)下。2019-06-06