SpringBoot統(tǒng)一數(shù)據(jù)返回格式的實(shí)現(xiàn)示例
在 Spring Boot 項(xiàng)目中,統(tǒng)一的數(shù)據(jù)格式返回是一種良好的實(shí)踐,它提高了代碼的可維護(hù)性和一致性,并改善了客戶端與服務(wù)端之間的通信。本文將介紹如何在 Spring Boot 中實(shí)現(xiàn)統(tǒng)一的數(shù)據(jù)格式返回。
1 為什么需要統(tǒng)一數(shù)據(jù)返回格式
- ?便前端程序員更好的接收和解析后端數(shù)據(jù)接?返回的數(shù)據(jù)。
- 降低前端程序員和后端程序員的溝通成本,按照某個(gè)格式實(shí)現(xiàn)就?了,因?yàn)樗薪?都是這樣返回的。
- 有利于項(xiàng)?統(tǒng)?數(shù)據(jù)的維護(hù)和修改。
- 有利于后端技術(shù)部?的統(tǒng)?規(guī)范的標(biāo)準(zhǔn)制定,不會(huì)出現(xiàn)稀奇古怪的返回內(nèi)容。
2 統(tǒng)一數(shù)據(jù)返回格式的實(shí)現(xiàn)
統(tǒng)?的數(shù)據(jù)返回格式可以使? @ControllerAdvice + ResponseBodyAdvice 的?式實(shí)現(xiàn)。
- @ControllerAdvice是Spring框架提供的一個(gè)用于全局處理控制器的增強(qiáng)器注解。通過@ControllerAdvice注解的類,可以將對(duì)應(yīng)的增強(qiáng)邏輯應(yīng)用到所有的@Controller注解的控制器中。
- @ResponseBodyAdvice是一個(gè)用于處理響應(yīng)體的接口。通過實(shí)現(xiàn)這個(gè)接口,可以在Controller方法返回之前和之后對(duì)響應(yīng)體進(jìn)行處理。
具體實(shí)現(xiàn)如下:
2.1 創(chuàng)建統(tǒng)一響應(yīng)類
首先,我們需要?jiǎng)?chuàng)建一個(gè)統(tǒng)一的響應(yīng)類,用于封裝 API 返回的數(shù)據(jù):
public class ApiResponse<T> { private int status; private String message; private T data; public ApiResponse(int status, String message, T data) { this.status = status; this.message = message; this.data = data; } // Getters and Setters }
2.2 創(chuàng)建統(tǒng)一響應(yīng)處理類
這里使用@controller注解和ResponseBodyAdvice來實(shí)現(xiàn)
@ControllerAdvice public class GlobalResponseBodyAdvice implements ResponseBodyAdvice<Object> { @Override public boolean supports(MethodParameter returnType, Class converterType) { // 判斷是否需要處理響應(yīng)體 return true; } @Override public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) { // 包裝響應(yīng)體 if (body instanceof ApiResponse) { return body; } return new ApiResponse<>(HttpStatus.OK.value(), "Success", body); } }
為了保證異常也能返回統(tǒng)一的數(shù)據(jù)格式,我們需要?jiǎng)?chuàng)建一個(gè)全局異常處理類,博客 講解了Spring Boot中如何進(jìn)行統(tǒng)一異常處理。
@ControllerAdvice //添加完此注解后,此類隨著springboot項(xiàng)目的啟動(dòng)而啟動(dòng),并且會(huì)監(jiān)控controller的異常.監(jiān)聽項(xiàng)目中所有的異常 @ResponseBody public class MyExceptionAdvice { //這里的一場(chǎng)都是意外異常,并不是業(yè)務(wù)異常,業(yè)務(wù)異常后端controller會(huì)處理返回給前端.業(yè)務(wù)異常會(huì)和前端溝通好已規(guī)定的狀態(tài)碼返回。 @ExceptionHandler(NullPointerException.class) public ApiResponse<String> doNullPointerException(NullPointerException e){ ApiResponse<String> apiResponse = new ApiResponse<>(HttpStatus.INTERNAL_SERVER_ERROR.value(), e.getMessage(), null); return apiResponse; } // 默認(rèn)的異常處理,當(dāng)有有異常出現(xiàn)的時(shí)候,會(huì)先匹配子類的異常,當(dāng)所有的異常都沒有匹配的時(shí)候就會(huì)走這一條默認(rèn)的一場(chǎng)路線業(yè)務(wù)。 @ExceptionHandler(Exception.class) public ApiResponse<String> doException(Exception e){ ApiResponse<String> apiResponse = new ApiResponse<>(HttpStatus.INTERNAL_SERVER_ERROR.value(), e.getMessage(), null); return apiResponse; } }
2.3 controller模擬數(shù)據(jù)并返回
觀察異常出現(xiàn)情況下和正常訪問情況下,是否都實(shí)現(xiàn)了統(tǒng)一格式返回。
@RestController @RequestMapping("/user") public class UserController { @RequestMapping("login") public String login(){ Object obj = null; System.out.println(obj.hashCode()); return "這里是login"; } @GetMapping("/data") public User getUserData() { // 這個(gè)方法會(huì)返回一個(gè)User對(duì)象 User user = new User(); user.setId(1); user.setName("張三"); user.setEmail("zhangsan@example.com"); return user; } @GetMapping("/success") public Integer getSuccessMessage() { // 這個(gè)方法會(huì)返回一個(gè)簡(jiǎn)單的字符串 return 123456; } }
訪問:127.0.0.1:8080/user/login 可以看到異常信息被統(tǒng)一處理并統(tǒng)一格式后返回。
訪問127.0.0.1:8080/user/data ,可以看到接收到的數(shù)據(jù)也被統(tǒng)一處理。
訪問127.0.0.1:8080/user/success ,可以看到接收到的數(shù)據(jù)也被統(tǒng)一處理。
總結(jié)
通過上述步驟,我們實(shí)現(xiàn)了使用@ControllerAdvice和ResponseBodyAdvice統(tǒng)一API數(shù)據(jù)返回格式的功能。這種方式不僅簡(jiǎn)化了代碼,還使得API響應(yīng)格式一致,更加規(guī)范和易于維護(hù)。
到此這篇關(guān)于SpringBoot統(tǒng)一數(shù)據(jù)返回格式的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)SpringBoot統(tǒng)一數(shù)據(jù)返回格式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
擴(kuò)展tk.mybatis的流式查詢功能實(shí)現(xiàn)
mybatis查詢默認(rèn)是一次獲取全部,如果數(shù)據(jù)過于龐大,就會(huì)導(dǎo)致OOM問題,本文就介紹了tk.mybatis 流式查詢,具有一定的參考價(jià)值,感興趣的可以了解一下2021-12-12一文帶你了解微服務(wù)架構(gòu)中的"發(fā)件箱模式"
微服務(wù)架構(gòu)如今非常的流行,這個(gè)架構(gòu)下可能經(jīng)常會(huì)遇到“雙寫”的場(chǎng)景。本文就和大家分享一個(gè)“發(fā)件箱模式”,?感興趣的小伙伴可以了解一下2023-01-01java反射實(shí)現(xiàn)javabean轉(zhuǎn)json實(shí)例代碼
基于java反射機(jī)制實(shí)現(xiàn)javabean轉(zhuǎn)json字符串實(shí)例,大家參考使用吧2013-12-12java算法導(dǎo)論之FloydWarshall算法實(shí)現(xiàn)代碼
這篇文章主要介紹了算法導(dǎo)論之FloydWarshall算法實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2017-05-05Eclipse項(xiàng)目怎么導(dǎo)入IDEA并運(yùn)行(超詳細(xì))
這篇文章主要介紹了Eclipse項(xiàng)目怎么導(dǎo)入IDEA并運(yùn)行(超詳細(xì)),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10詳解Spring中InitializingBean接口的功能
這篇文章主要介紹了Spring中InitializingBean接口的功能,講述了spring中InitializingBean接口的功能簡(jiǎn)介說明,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05