詳解SpringBoot中的統(tǒng)一結(jié)果返回與統(tǒng)一異常處理
引言
在開(kāi)發(fā)Spring Boot應(yīng)用時(shí),我們經(jīng)常面臨著不同的控制器方法需要處理各種不同類(lèi)型的響應(yīng)結(jié)果,以及在代碼中分散處理異常可能導(dǎo)致項(xiàng)目難以維護(hù)的問(wèn)題。你是否曾經(jīng)遇到過(guò)在不同地方編寫(xiě)相似的返回格式,或者在處理異常時(shí)感到有些混亂?這些看似小問(wèn)題的積累,實(shí)際上可能對(duì)項(xiàng)目產(chǎn)生深遠(yuǎn)的影響。統(tǒng)一結(jié)果返回和統(tǒng)一異常處理并非只是為了規(guī)范代碼,更是為了提高團(tuán)隊(duì)的協(xié)作效率、降低項(xiàng)目維護(hù)的難度,并使代碼更易于理解和擴(kuò)展。
本文的目的是幫助你更好地理解和應(yīng)用Spring Boot中的統(tǒng)一結(jié)果返回和統(tǒng)一異常處理。通過(guò)詳細(xì)的討論和實(shí)例演示,我們將為你提供一套清晰的指南,讓你能夠在自己的項(xiàng)目中輕松應(yīng)用這些技術(shù),提高代碼質(zhì)量,減輕開(kāi)發(fā)壓力。
統(tǒng)一結(jié)果返回
統(tǒng)一結(jié)果返回是一種通過(guò)定義通用的返回格式,使所有的響應(yīng)結(jié)果都符合同一標(biāo)準(zhǔn)的方法。這有助于提高代碼的一致性,減少重復(fù)代碼的編寫(xiě),以及使客戶端更容易理解和處理API的響應(yīng)。統(tǒng)一結(jié)果返回不僅規(guī)范了代碼結(jié)構(gòu),還能提高團(tuán)隊(duì)協(xié)作效率,降低項(xiàng)目維護(hù)的難度。
接下來(lái)讓我們一起看看在SpringBoot中如何實(shí)現(xiàn)統(tǒng)一結(jié)果返回。
1. 定義通用的響應(yīng)對(duì)象
當(dāng)實(shí)現(xiàn)統(tǒng)一結(jié)果返回時(shí),需要?jiǎng)?chuàng)建一個(gè)通用的響應(yīng)對(duì)象,定義成功和失敗的返回情況,并確保在接口中使用這個(gè)通用返回對(duì)象。
@Setter @Getter public class ResultResponse<T> implements Serializable { private static final long serialVersionUID = -1133637474601003587L; /** * 接口響應(yīng)狀態(tài)碼 */ private Integer code; /** * 接口響應(yīng)信息 */ private String msg; /** * 接口響應(yīng)的數(shù)據(jù) */ private T data; }
2. 定義接口響應(yīng)狀態(tài)碼
統(tǒng)一結(jié)果返回的關(guān)鍵之一是規(guī)定一套通用的狀態(tài)碼。這有助于客戶端更容易地理解和處理 API 的響應(yīng),同時(shí)也為開(kāi)發(fā)者提供了一致的標(biāo)準(zhǔn)。通常,一些 HTTP 狀態(tài)碼已經(jīng)被廣泛接受,如:
200 OK
:表示成功處理請(qǐng)求。201 Created
:表示成功創(chuàng)建資源。204 No Content
:表示成功處理請(qǐng)求,但沒(méi)有返回任何內(nèi)容。
對(duì)于錯(cuò)誤情況,也可以使用常見(jiàn)的 HTTP 狀態(tài)碼,如:
400 Bad Request
:客戶端請(qǐng)求錯(cuò)誤。401 Unauthorized
:未授權(quán)訪問(wèn)。404 Not Found
:請(qǐng)求資源不存在。500 Internal Server Error
:服務(wù)器內(nèi)部錯(cuò)誤。
除了 HTTP 狀態(tài)碼外,你還可以定義自己的應(yīng)用程序特定狀態(tài)碼,以表示更具體的情況。確保文檔中清晰地說(shuō)明了每個(gè)狀態(tài)碼所代表的含義,使開(kāi)發(fā)者能夠正確地解釋和處理它們。
public enum StatusEnum { SUCCESS(200 ,"請(qǐng)求處理成功"), UNAUTHORIZED(401 ,"用戶認(rèn)證失敗"), FORBIDDEN(403 ,"權(quán)限不足"), SERVICE_ERROR(500, "服務(wù)器去旅行了,請(qǐng)稍后重試"), PARAM_INVALID(1000, "無(wú)效的參數(shù)"), ; public final Integer code; public final String message; StatusEnum(Integer code, String message) { this.code = code; this.message = message; } }
3. 定義統(tǒng)一的成功和失敗的處理方法
定義統(tǒng)一的成功和失敗的響應(yīng)方法有助于保持代碼一致性和規(guī)范性,簡(jiǎn)化控制器邏輯,提高代碼復(fù)用性,降低維護(hù)成本,提高可讀性,促進(jìn)團(tuán)隊(duì)協(xié)作,以及更便于進(jìn)行測(cè)試。
/** * 封裝成功響應(yīng)的方法 * @param data 響應(yīng)數(shù)據(jù) * @return reponse * @param <T> 響應(yīng)數(shù)據(jù)類(lèi)型 */ public static <T> ResultResponse<T> success(T data) { ResultResponse<T> response = new ResultResponse<>(); response.setData(data); response.setCode(StatusEnum.SUCCESS.code); return response; } /** * 封裝error的響應(yīng) * @param statusEnum error響應(yīng)的狀態(tài)值 * @return * @param <T> */ public static <T> ResultResponse<T> error(StatusEnum statusEnum) { return error(statusEnum, statusEnum.message); } /** * 封裝error的響應(yīng) 可自定義錯(cuò)誤信息 * @param statusEnum error響應(yīng)的狀態(tài)值 * @return * @param <T> */ public static <T> ResultResponse<T> error(StatusEnum statusEnum, String errorMsg) { ResultResponse<T> response = new ResultResponse<>(); response.setCode(statusEnum.code); response.setMsg(errorMsg); return response; }
4. web層統(tǒng)一響應(yīng)結(jié)果
在web層使用統(tǒng)一結(jié)果返回的目的是將業(yè)務(wù)邏輯的處理結(jié)果按照預(yù)定的通用格式進(jìn)行封裝,以提高代碼的一致性和可讀性。
@RestController @RequestMapping("user") @Validated @Slf4j public class UserController { private IUserService userService; /** * 創(chuàng)建用戶 * @param requestVO * @return */ @PostMapping("create") public ResultResponse<Void> createUser(@Validated @RequestBody UserCreateRequestVO requestVO){ return ResultResponse.success(null); } /** * 根據(jù)用戶ID獲取用戶信息 * @param userId 用戶id * @return 用戶信息 */ @GetMapping("info") public ResultResponse<UserInfoResponseVO> getUser(@NotBlank(message = "請(qǐng)選擇用戶") String userId){ final UserInfoResponseVO responseVO = userService.getUserInfoById(userId); return ResultResponse.success(responseVO); } @Autowired public void setUserService(IUserService userService) { this.userService = userService; } }
調(diào)用接口,響應(yīng)的信息統(tǒng)一為:
{ "code": 200, "msg": null, "data": null } { "code": 200, "msg": null, "data": { "userId": "121", "userName": "碼農(nóng)Academy" } }
統(tǒng)一結(jié)果返回通過(guò)定義通用的返回格式、成功和失敗的返回情況,以及在控制器中使用這一模式,旨在提高代碼的一致性、可讀性和可維護(hù)性。采用統(tǒng)一的響應(yīng)格式簡(jiǎn)化了業(yè)務(wù)邏輯處理流程,使得開(kāi)發(fā)者更容易處理成功和失敗的情況,同時(shí)客戶端也更容易理解和處理 API 的響應(yīng)。這一實(shí)踐有助于降低維護(hù)成本、提高團(tuán)隊(duì)協(xié)作效率,并促進(jìn)代碼的規(guī)范化。
統(tǒng)一異常處理
統(tǒng)一異常處理的必要性體現(xiàn)在保持代碼的一致性、提供更清晰的錯(cuò)誤信息、以及更容易排查問(wèn)題。通過(guò)定義統(tǒng)一的異常處理方式,確保在整個(gè)應(yīng)用中對(duì)異常的處理保持一致,減少了重復(fù)編寫(xiě)相似異常處理邏輯的工作,同時(shí)提供友好的錯(cuò)誤信息幫助開(kāi)發(fā)者和維護(hù)人員更快地定位和解決問(wèn)題,最終提高了應(yīng)用的可維護(hù)性和可讀性。
1.定義統(tǒng)一的異常類(lèi)
我們需要定義服務(wù)中可能拋出的自定義異常類(lèi)。這些異常類(lèi)可以繼承自RuntimeException
,并攜帶有關(guān)異常的相關(guān)信息。即可理解為局部異常,用于特定的業(yè)務(wù)處理中異常。手動(dòng)埋點(diǎn)拋出。
@Getter public class ServiceException extends RuntimeException{ private static final long serialVersionUID = -3303518302920463234L; private final StatusEnum status; public ServiceException(StatusEnum status, String message) { super(message); this.status = status; } public ServiceException(StatusEnum status) { this(status, status.message); } }
2.異常處理器
創(chuàng)建一個(gè)全局的異常處理器,使用@ControllerAdvice
或者 @RestControllerAdvice
注解和@ExceptionHandler
注解來(lái)捕獲不同類(lèi)型的異常,并定義處理邏輯。
2.1 @ControllerAdvice注解
用于聲明一個(gè)全局控制器建言(Advice),相當(dāng)于把@ExceptionHandler
、@InitBinder
和@ModelAttribute
注解的方法集中到一個(gè)地方。常放在一個(gè)特定的類(lèi)上,這個(gè)類(lèi)被認(rèn)為是全局異常處理器,可以跨足多個(gè)控制器。
當(dāng)時(shí)用@ControllerAdvice
時(shí),我們需要在異常處理方法上加上@ResponseBody
,同理我們的web接口。但是如果我們使用@RestControllerAdvice
就可以不用加,同理也是web定義的接口
2.2 `@ExceptionHandler`注解
用于定義異常處理方法,處理特定類(lèi)型的異常。放在全局異常處理器類(lèi)中的具體方法上。
通過(guò)這兩個(gè)注解的配合,可以實(shí)現(xiàn)全局的異常處理。當(dāng)控制器中拋出異常時(shí),Spring Boot會(huì)自動(dòng)調(diào)用匹配的@ExceptionHandler
方法來(lái)處理異常,并返回定義的響應(yīng)。
@Slf4j @ControllerAdvice public class ExceptionAdvice { /** * 處理ServiceException * @param serviceException ServiceException * @param request 請(qǐng)求參數(shù) * @return 接口響應(yīng) */ @ExceptionHandler(ServiceException.class) @ResponseBody public ResultResponse<Void> handleServiceException(ServiceException serviceException, HttpServletRequest request) { log.warn("request {} throw ServiceException \n", request, serviceException); return ResultResponse.error(serviceException.getStatus(), serviceException.getMessage()); } /** * 其他異常攔截 * @param ex 異常 * @param request 請(qǐng)求參數(shù) * @return 接口響應(yīng) */ @ExceptionHandler(Exception.class) @ResponseBody public ResultResponse<Void> handleException(Exception ex, HttpServletRequest request) { log.error("request {} throw unExpectException \n", request, ex); return ResultResponse.error(StatusEnum.SERVICE_ERROR); } }
3.異常統(tǒng)一處理使用
在業(yè)務(wù)開(kāi)發(fā)過(guò)程中,我們可以在service
層處理業(yè)務(wù)時(shí),可以手動(dòng)拋出業(yè)務(wù)異常。由全局異常處理器進(jìn)行統(tǒng)一處理。
@Service @Slf4j public class UserServiceImpl implements IUserService { private IUserManager userManager; /** * 創(chuàng)建用戶 * * @param requestVO 請(qǐng)求參數(shù) */ @Override public void createUser(UserCreateRequestVO requestVO) { final UserDO userDO = userManager.selectUserByName(requestVO.getUserName()); if (userDO != null){ throw new ServiceException(StatusEnum.PARAM_INVALID, "用戶名已存在"); } } @Autowired public void setUserManager(IUserManager userManager) { this.userManager = userManager; } } @RestController @RequestMapping("user") @Validated @Slf4j public class UserController { private IUserService userService; /** * 創(chuàng)建用戶 * @param requestVO * @return */ @PostMapping("create") public ResultResponse<Void> createUser(@Validated @RequestBody UserCreateRequestVO requestVO){ userService.createUser(requestVO); return ResultResponse.success(null); } @Autowired public void setUserService(IUserService userService) { this.userService = userService; } }
當(dāng)我們請(qǐng)求接口時(shí),假如用戶名稱已存在,接口就會(huì)響應(yīng):
{ "code": 1000, "msg": "用戶名已存在", "data": null }
統(tǒng)一異常處理帶來(lái)的好處包括提供一致的異常響應(yīng)格式,簡(jiǎn)化異常處理邏輯,記錄更好的錯(cuò)誤日志,以及更容易排查和解決問(wèn)題。通過(guò)統(tǒng)一處理異常,我們確保在整個(gè)應(yīng)用中對(duì)異常的處理方式一致,減少了重復(fù)性代碼的編寫(xiě),提高了代碼的規(guī)范性。簡(jiǎn)化的異常處理邏輯降低了開(kāi)發(fā)者的工作負(fù)擔(dān),而更好的錯(cuò)誤日志有助于更迅速地定位和解決問(wèn)題,最終提高了應(yīng)用的可維護(hù)性和穩(wěn)定性。
其他類(lèi)型的異常處理
在項(xiàng)目開(kāi)發(fā)過(guò)程中,我們還有一些常見(jiàn)的特定異常類(lèi)型,比如MethodArgumentNotValidException
和UnexpectedTypeException
等,并為它們定義相應(yīng)的異常處理邏輯。這些特定異??赡苡捎谡?qǐng)求參數(shù)校驗(yàn)失敗或意外的數(shù)據(jù)類(lèi)型問(wèn)題而引起,因此有必要為它們單獨(dú)處理,以提供更具體和友好的異常響應(yīng)。
1.MethodArgumentNotValidException
由于請(qǐng)求參數(shù)校驗(yàn)失敗引起的異常,通常涉及到使用@Valid
注解或者@Validated
進(jìn)行請(qǐng)求參數(shù)校驗(yàn)。我們可以在異常處理器中編寫(xiě)@ExceptionHandler
方法,捕獲并處理MethodArgumentNotValidException
,提取校驗(yàn)錯(cuò)誤信息,并返回詳細(xì)的錯(cuò)誤響應(yīng)。
/** * 參數(shù)非法校驗(yàn) * @param ex * @return */ @ExceptionHandler(MethodArgumentNotValidException.class) @ResponseBody public ResultResponse<Void> handleMethodArgumentNotValidException(MethodArgumentNotValidException ex) { try { List<ObjectError> errors = ex.getBindingResult().getAllErrors(); String message = errors.stream().map(ObjectError::getDefaultMessage).collect(Collectors.joining(",")); log.error("param illegal: {}", message); return ResultResponse.error(StatusEnum.PARAM_INVALID, message); } catch (Exception e) { return ResultResponse.error(StatusEnum.SERVICE_ERROR); } }
當(dāng)我們使用@Valid
注解或者@Validated
進(jìn)行請(qǐng)求參數(shù)校驗(yàn)不通過(guò)時(shí),響應(yīng)結(jié)果為:
{ "code": 1000, "msg": "請(qǐng)輸入地址信息,用戶年齡必須小于60歲,請(qǐng)輸入你的興趣愛(ài)好", "data": null }
關(guān)于@Valid
注解或者@Validated
進(jìn)行參數(shù)校驗(yàn)的功能請(qǐng)參考:SpringBoot優(yōu)雅校驗(yàn)參數(shù)
2.UnexpectedTypeException
意外的數(shù)據(jù)類(lèi)型異常,通常表示程序運(yùn)行時(shí)發(fā)生了不符合預(yù)期的數(shù)據(jù)類(lèi)型問(wèn)題。一個(gè)常見(jiàn)的使用場(chǎng)景是在數(shù)據(jù)轉(zhuǎn)換或類(lèi)型處理的過(guò)程中。例如,在使用 Spring 表單綁定或數(shù)據(jù)綁定時(shí),如果嘗試將一個(gè)不符合預(yù)期類(lèi)型的值轉(zhuǎn)換為目標(biāo)類(lèi)型,就可能拋出 UnexpectedTypeException
。這通常會(huì)發(fā)生在將字符串轉(zhuǎn)換為數(shù)字、日期等類(lèi)型時(shí),如果字符串的格式不符合目標(biāo)類(lèi)型的要求。
我們可以在異常處理器中編寫(xiě)@ExceptionHandler
方法,捕獲并處理UnexpectedTypeException
,提供適當(dāng)?shù)奶幚矸绞?,例如記錄錯(cuò)誤日志,并返回合適的錯(cuò)誤響應(yīng)。
@ExceptionHandler(UnexpectedTypeException.class) @ResponseBody public ResultResponse<Void> handleUnexpectedTypeException(UnexpectedTypeException ex, HttpServletRequest request) { log.error("catch UnexpectedTypeException, errorMessage: \n", ex); return ResultResponse.error(StatusEnum.PARAM_INVALID, ex.getMessage()); }
當(dāng)發(fā)生異常時(shí),接口會(huì)響應(yīng):
{ "code": 500, "msg": "服務(wù)器去旅行了,請(qǐng)稍后重試", "data": null }
3.ConstraintViolationException
javax.validation.ConstraintViolationException
是 Java Bean Validation(JSR 380)中的一種異常。它通常在使用 Bean Validation 進(jìn)行數(shù)據(jù)校驗(yàn)時(shí),如果校驗(yàn)失敗就會(huì)拋出這個(gè)異常。即我們?cè)谑褂米远x校驗(yàn)注解時(shí),如果不滿足校驗(yàn)規(guī)則,就會(huì)拋出這個(gè)錯(cuò)誤。
@ExceptionHandler(ConstraintViolationException.class) @ResponseBody public ResultResponse<Void> handlerConstraintViolationException(ConstraintViolationException ex, HttpServletRequest request) { log.error("request {} throw ConstraintViolationException \n", request, ex); return ResultResponse.error(StatusEnum.PARAM_INVALID, ex.getMessage()); }
案例請(qǐng)參考:SpringBoot優(yōu)雅校驗(yàn)參數(shù),注冊(cè)ConstraintValidator示例中的@UniqueUser
校驗(yàn)。
4.HttpMessageNotReadableException
表示無(wú)法讀取HTTP消息的異常,通常由于請(qǐng)求體不合法或不可解析。
@ResponseBody @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler(HttpMessageNotReadableException.class) public ResultResponse<Void> handleHttpMessageNotReadableException(HttpMessageNotReadableException ex, HttpServletRequest request) { log.error("request {} throw ucManagerException \n", request, ex); return ResultResponse.error(StatusEnum.SERVICE_ERROR); }
5.HttpRequestMethodNotSupportedException
Spring Framework 中的異常類(lèi),表示請(qǐng)求的 HTTP 方法不受支持。當(dāng)客戶端發(fā)送了一個(gè)使用不被服務(wù)器支持的 HTTP 方法(如 GET、POST、PUT、DELETE等)的請(qǐng)求時(shí),可能會(huì)拋出這個(gè)異常。
@ExceptionHandler({HttpRequestMethodNotSupportedException.class, HttpMediaTypeException.class}) @ResponseBody public ResultResponse<Void> handleMethodNotSupportedException(Exception ex) { log.error("HttpRequestMethodNotSupportedException \n", ex); return ResultResponse.error(StatusEnum.HTTP_METHOD_NOT_SUPPORT); }
全局異常處理與局部異常處理在Spring Boot應(yīng)用開(kāi)發(fā)中扮演不同角色。全局異常處理通過(guò)統(tǒng)一的異常處理器確保了整個(gè)應(yīng)用對(duì)異常的處理一致性,減少了冗余代碼,提高了代碼的整潔度。然而,這種方式可能在靈活性上略顯不足,無(wú)法滿足每個(gè)具體控制器或業(yè)務(wù)場(chǎng)景的個(gè)性化需求。
相比之下,局部異常處理能夠?yàn)槊總€(gè)控制器或業(yè)務(wù)場(chǎng)景提供更具體、靈活的異常處理邏輯,允許定制化的異常響應(yīng)。這使得在復(fù)雜的項(xiàng)目中更容易處理特定的異常情況,同時(shí)提供更詳細(xì)的錯(cuò)誤信息。然而,局部異常處理可能帶來(lái)代碼冗余和維護(hù)難度的問(wèn)題,特別是在大型項(xiàng)目中。
在實(shí)際應(yīng)用中,選擇全局異常處理還是局部異常處理應(yīng)根據(jù)項(xiàng)目規(guī)模和需求進(jìn)行權(quán)衡。對(duì)于小型項(xiàng)目或簡(jiǎn)單場(chǎng)景,全局異常處理可能是一種更簡(jiǎn)單、合適的選擇。而對(duì)于大型項(xiàng)目或需要個(gè)性化異常處理的復(fù)雜業(yè)務(wù)邏輯,局部異常處理則提供了更為靈活的方案。最佳實(shí)踐是在項(xiàng)目中根據(jù)具體情況靈活使用這兩種方式,以平衡一致性和個(gè)性化需求。
最佳實(shí)踐與注意事項(xiàng)
1. 最佳實(shí)踐
- 統(tǒng)一響應(yīng)格式: 在異常處理中,使用統(tǒng)一的響應(yīng)格式有助于客戶端更容易理解和處理錯(cuò)誤。通常,返回一個(gè)包含錯(cuò)誤碼、錯(cuò)誤信息和可能的詳細(xì)信息的響應(yīng)對(duì)象。
- 詳細(xì)錯(cuò)誤日志: 在異常處理中記錄詳細(xì)的錯(cuò)誤日志,包括異常類(lèi)型、發(fā)生時(shí)間、請(qǐng)求信息等。這有助于快速定位和解決問(wèn)題。
- 使用HTTP狀態(tài)碼: 根據(jù)異常的性質(zhì),選擇適當(dāng)?shù)腍TTP狀態(tài)碼。例如,使用
HttpStatus.NOT_FOUND
表示資源未找到,HttpStatus.BAD_REQUEST
表示客戶端請(qǐng)求錯(cuò)誤等。 - 異常分類(lèi): 根據(jù)異常的種類(lèi),合理分類(lèi)處理??梢远x不同的異常類(lèi)來(lái)表示不同的異常情況,然后在異常處理中使用
@ExceptionHandler
分別處理。 - 全局異常處理: 使用全局異常處理機(jī)制來(lái)捕獲未被特定控制器處理的異常,以確保應(yīng)用在整體上的健壯性。
2 注意事項(xiàng)
- 不濫用異常: 異常應(yīng)該用于表示真正的異常情況,而不是用作控制流程。濫用異??赡軐?dǎo)致性能問(wèn)題和代碼可讀性降低。
- 不忽略異常: 避免在異常處理中忽略異常或僅僅打印日志而不進(jìn)行適當(dāng)?shù)奶幚?。這可能導(dǎo)致潛在的問(wèn)題被掩蓋,難以追蹤和修復(fù)。
- 避免空的catch塊: 不要在
catch
塊中什么都不做,這樣會(huì)使得異常難以被發(fā)現(xiàn)。至少在catch
塊中記錄日志,以便了解異常的發(fā)生。 - 適時(shí)拋出異常: 不要過(guò)于吝嗇地拋出異常,但也不要無(wú)謂地濫用。在必要的時(shí)候使用異常,例如表示無(wú)法繼續(xù)執(zhí)行的錯(cuò)誤情況。
- 測(cè)試異常場(chǎng)景: 編寫(xiě)單元測(cè)試時(shí),確保覆蓋異常場(chǎng)景,驗(yàn)證異常的正確拋出和處理。
總結(jié)
異常處理在應(yīng)用開(kāi)發(fā)中是至關(guān)重要的一環(huán),它能夠提高應(yīng)用的健壯性、可讀性和可維護(hù)性。全局異常處理和局部異常處理各有優(yōu)劣,需要根據(jù)項(xiàng)目的規(guī)模和需求來(lái)靈活選擇。通過(guò)采用統(tǒng)一的響應(yīng)格式、詳細(xì)的錯(cuò)誤日志、適當(dāng)?shù)腍TTP狀態(tài)碼等最佳實(shí)踐,可以使異常處理更為有效和易于管理。同時(shí),注意避免濫用異常、忽略異常、適時(shí)拋出異常等注意事項(xiàng),有助于確保異常處理的質(zhì)量。在開(kāi)發(fā)過(guò)程中,持續(xù)關(guān)注和優(yōu)化異常處理,將有助于提高應(yīng)用的穩(wěn)定性和用戶體驗(yàn)。
以上就是詳解SpringBoot中的統(tǒng)一結(jié)果返回與統(tǒng)一異常處理的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot統(tǒng)一結(jié)果返回與統(tǒng)一異常處理的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java多線程 Callable、Future 和FutureTask
這篇文章主要介紹Java多線程中的 Callable、Future 以及FutureTask,下面文章圍繞Java多線程的相關(guān)資料展開(kāi)全文詳細(xì)內(nèi)容,需要的朋友可以參考一下2021-10-10Mybatis中注入執(zhí)行sql查詢、更新、新增及建表語(yǔ)句案例代碼
這篇文章主要介紹了Mybatis中注入執(zhí)行sql查詢、更新、新增以及建表語(yǔ)句,主要說(shuō)明一個(gè)另類(lèi)的操作,注入sql,并使用mybatis執(zhí)行,結(jié)合案例代碼詳解講解,需要的朋友可以參考下2023-02-02Java 讀取類(lèi)路徑下的資源文件實(shí)現(xiàn)代碼
這篇文章主要介紹了Java 讀取類(lèi)路徑下的資源文件實(shí)現(xiàn)代碼的相關(guān)資料,主要實(shí)現(xiàn)工具類(lèi)代碼ResourceLoadUtil.java的實(shí)例需要的朋友可以參考下2017-07-07macOS中搭建Java8開(kāi)發(fā)環(huán)境(基于Intel?x86?64-bit)
這篇文章主要介紹了macOS中搭建Java8開(kāi)發(fā)環(huán)境(基于Intel?x86?64-bit)?的相關(guān)資料,需要的朋友可以參考下2022-12-12Spring Cloud Ribbon客戶端詳細(xì)介紹
Spring Cloud Ribbon 是一套基于 Netflix Ribbon 實(shí)現(xiàn)的客戶端負(fù)載均衡和服務(wù)調(diào)用工具。通過(guò)Spring Cloud的封裝,可以讓我們輕松地將面向服務(wù)的REST模版請(qǐng)求自動(dòng)轉(zhuǎn)換成客戶端負(fù)載均衡的服務(wù)調(diào)用2022-09-09Java 入門(mén)圖形用戶界面設(shè)計(jì)之事件處理上
圖形界面(簡(jiǎn)稱GUI)是指采用圖形方式顯示的計(jì)算機(jī)操作用戶界面。與早期計(jì)算機(jī)使用的命令行界面相比,圖形界面對(duì)于用戶來(lái)說(shuō)在視覺(jué)上更易于接受,本篇精講Java語(yǔ)言中關(guān)于圖形用戶界面的事件處理2022-02-02Spring?Boot開(kāi)發(fā)RESTful接口與http協(xié)議狀態(tài)表述
這篇文章主要為大家介紹了Spring?Boot開(kāi)發(fā)RESTful接口與http協(xié)議狀態(tài)表述,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03手把手帶你掌握SpringBoot RabbitMQ延遲隊(duì)列
RabbitMQ 是一個(gè)由Erlang語(yǔ)言開(kāi)發(fā)的AMQP的開(kāi)源實(shí)現(xiàn),支持多種客戶端。用于在分布式系統(tǒng)中存儲(chǔ)轉(zhuǎn)發(fā)消息,在易用性、擴(kuò)展性、高可用性等方面表現(xiàn)不俗,下文將帶你深入了解 RabbitMQ 延遲隊(duì)列2021-09-09