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