關(guān)于SpringBoot使用@ExceptionHandler注解局部異常處理
介紹
在開發(fā) Web 應(yīng)用程序時(shí),異常處理是非常重要的一部分。SpringBoot 提供了多種方式來處理異常,其中之一是使用 @ExceptionHandler 注解進(jìn)行局部異常處理。使用 @ExceptionHandler 注解,我們可以在 Controller 層或方法級別上處理異常,而不用在整個(gè)應(yīng)用程序中處理。
@ExceptionHandler 注解
@ExceptionHandler 注解是 SpringFramework 提供的一個(gè)注解,用于處理控制器中出現(xiàn)的異常。當(dāng)在控制器方法中拋出異常時(shí),SpringBoot 會查找?guī)в?@ExceptionHandler 注解的方法,并調(diào)用它來處理異常。
下面是一個(gè)簡單的例子:
@RestController public class UserController { @GetMapping("/users/{id}") public User getUser(@PathVariable int id) { User user = userRepository.findById(id); if (user == null) { throw new UserNotFoundException("User not found"); } return user; } @ExceptionHandler(UserNotFoundException.class) public ResponseEntity<ErrorResponse> handleUserNotFoundException(UserNotFoundException ex) { ErrorResponse error = new ErrorResponse(HttpStatus.NOT_FOUND.value(), ex.getMessage()); return new ResponseEntity<>(error, HttpStatus.NOT_FOUND); } }
在上面的代碼中,我們定義了一個(gè) UserController 類,并實(shí)現(xiàn)了一個(gè) getUser 方法。如果用戶不存在,則拋出 UserNotFoundException 異常。然后,我們使用 @ExceptionHandler 注解定義了一個(gè) handleUserNotFoundException 方法,用于處理 UserNotFoundException 異常。在該方法中,我們創(chuàng)建了一個(gè) ErrorResponse 對象,包含了錯(cuò)誤響應(yīng)的狀態(tài)碼和消息,然后將其封裝在 ResponseEntity 對象中返回。
如何使用 @ExceptionHandler 注解進(jìn)行局部異常處理
要使用 @ExceptionHandler 注解進(jìn)行局部異常處理,請按照以下步驟操作:
第 1 步:定義自定義異常
在代碼中定義自定義異常,繼承自 Exception 或 RuntimeException 類。例如:
public class UserNotFoundException extends RuntimeException { public UserNotFoundException(String message) { super(message); } }
在上面的代碼中,我們定義了一個(gè)名為 UserNotFoundException 的自定義異常,它繼承自 RuntimeException 類。
第 2 步:拋出異常
在控制器方法中拋出自定義異常。例如:
@GetMapping("/users/{id}") public User getUser(@PathVariable int id) { User user = userRepository.findById(id); if (user == null) { throw new UserNotFoundException("User not found"); } return user; }
在上面的代碼中,如果用戶不存在,則拋出 UserNotFoundException 異常。
第 3 步:處理異常
使用 @ExceptionHandler 注解定義一個(gè)方法,用于處理自定義異常。例如:
@ExceptionHandler(UserNotFoundException.class) public ResponseEntity<ErrorResponse> handleUserNotFoundException(UserNotFoundException ex) { ErrorResponse error = new ErrorResponse(HttpStatus.NOT_FOUND.value(), ex.getMessage()); return new ResponseEntity<>(error, HttpStatus.NOT_FOUND); }
在上面的代碼中,我們使用 @ExceptionHandler(UserNotFoundException.class) 注解定義了一個(gè)方法 handleUserNotFoundException,用于處理 UserNotFoundException 異常。在該方法中,我們創(chuàng)建了一個(gè) ErrorResponse 對象,包含了錯(cuò)誤響應(yīng)的狀態(tài)碼和消息,然后將其封裝在 ResponseEntity 對象中返回。
示例
以下是一個(gè)完整的示例:
UserController.java
@RestController public class UserController { @Autowired private UserRepository userRepository; @GetMapping("/users/{id}") public User getUser(@PathVariable int id) { User user = userRepository.findById(id); if (user == null) { throw new UserNotFoundException("User not found"); } return user; } @PostMapping("/users") public User createUser(@RequestBody User user) { userRepository.save(user); return user; } @PutMapping("/users/{id}") public User updateUser(@PathVariable int id, @RequestBody User user) { User existingUser = userRepository.findById(id); if (existingUser == null) { throw new UserNotFoundException("User not found"); } existingUser.setName(user.getName()); existingUser.setAge(user.getAge()); userRepository.save(existingUser); return existingUser; } @DeleteMapping("/users/{id}") public void deleteUser(@PathVariable int id) { UseruserRepository.deleteById(id); } @ExceptionHandler(UserNotFoundException.class) public ResponseEntity<ErrorResponse> handleUserNotFoundException(UserNotFoundException ex) { ErrorResponse error = new ErrorResponse(HttpStatus.NOT_FOUND.value(), ex.getMessage()); return new ResponseEntity<>(error, HttpStatus.NOT_FOUND); } }
UserNotFoundException.java
public class UserNotFoundException extends RuntimeException { public UserNotFoundException(String message) { super(message); } }
ErrorResponse.java
public class ErrorResponse { private int status; private String message; public ErrorResponse(int status, String message) { this.status = status; this.message = message; } public int getStatus() { return status; } public String getMessage() { return message; } }
在上面的代碼中,我們定義了一個(gè) UserController 類,實(shí)現(xiàn)了 getUser、createUser、updateUser 和 deleteUser 方法。如果用戶不存在,則拋出 UserNotFoundException 異常。然后,我們使用 @ExceptionHandler 注解定義了一個(gè) handleUserNotFoundException 方法,用于處理 UserNotFoundException 異常。在該方法中,我們創(chuàng)建了一個(gè) ErrorResponse 對象,包含了錯(cuò)誤響應(yīng)的狀態(tài)碼和消息,然后將其封裝在 ResponseEntity 對象中返回。
原理
當(dāng)控制器方法拋出異常時(shí),SpringBoot 會在控制器類中查找?guī)в?@ExceptionHandler 注解的方法,并調(diào)用它來處理異常。@ExceptionHandler 注解的方法必須具有以下特征:
- 方法必須是 public、沒有返回值,并且具有一個(gè)參數(shù),該參數(shù)類型為拋出的異常類型。
- 方法必須使用 @ExceptionHandler 注解進(jìn)行注解,該注解的參數(shù)為拋出的異常類型。
當(dāng)控制器方法拋出異常時(shí),SpringBoot 將異常傳遞給帶有 @ExceptionHandler 注解的方法。該方法將處理異常,并返回一個(gè) ResponseEntity 對象,該對象包含錯(cuò)誤響應(yīng)的狀態(tài)碼和消息。
總結(jié)
在本文中,我們介紹了 SpringBoot 中的 @ExceptionHandler 注解,演示了如何使用它進(jìn)行局部異常處理。使用 @ExceptionHandler 注解,我們可以在 Controller 層或方法級別上處理異常。當(dāng)控制器方法拋出異常時(shí),SpringBoot 會查找?guī)в?@ExceptionHandler 注解的方法,并調(diào)用它來處理異常。要使用 @ExceptionHandler 注解進(jìn)行局部異常處理,需要定義自定義異常、拋出異常和處理異常。
到此這篇關(guān)于關(guān)于SpringBoot使用@ExceptionHandler注解局部異常處理的文章就介紹到這了,更多相關(guān)@ExceptionHandler局部異常處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Spring中的@ExceptionHandler注解統(tǒng)一異常處理詳解
- SpringMVC使用@ExceptionHandler注解在Controller中處理異常
- Spring的異常處理@ExceptionHandler注解解析
- Spring中@ExceptionHandler注解的使用方式
- Spring中@ExceptionHandler注解的工作原理詳解
- Spring @ExceptionHandler注解統(tǒng)一異常處理和獲取方法名
- Spring中的@ControllerAdvice和@ExceptionHandler注解處理全局異常
- Spring中的@ExceptionHandler注解詳解與應(yīng)用示例
相關(guān)文章
深入淺出講解Spring框架中依賴注入與控制反轉(zhuǎn)及應(yīng)用
依賴注入(Dependency?Injection)和控制反轉(zhuǎn)(Inversion?of?Control)是同一個(gè)概念。具體含義是:當(dāng)某個(gè)角色(可能是一個(gè)Java實(shí)例,調(diào)用者)需要另一個(gè)角色(另一個(gè)Java實(shí)例,被調(diào)用者)的協(xié)助時(shí),在?傳統(tǒng)的程序設(shè)計(jì)過程中,通常由調(diào)用者來創(chuàng)建被調(diào)用者的實(shí)例2022-03-03SpringBoot @value注解動(dòng)態(tài)刷新問題小結(jié)
@Value注解 所對應(yīng)的數(shù)據(jù)源來自項(xiàng)目的 Environment 中,我們可以將數(shù)據(jù)庫或其他文件中的數(shù)據(jù),加載到項(xiàng)目的 Environment 中,然后 @Value注解 就可以動(dòng)態(tài)獲取到配置信息了,這篇文章主要介紹了SpringBoot @value注解動(dòng)態(tài)刷新,需要的朋友可以參考下2023-09-09java實(shí)現(xiàn)刪除某條信息并刷新當(dāng)前頁操作
這篇文章主要介紹了java實(shí)現(xiàn)刪除某條信息并刷新當(dāng)前頁操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11Java前后端分離的在線點(diǎn)餐系統(tǒng)實(shí)現(xiàn)詳解
這是一個(gè)基于SpringBoot+Vue框架開發(fā)的在線點(diǎn)餐系統(tǒng)。首先,這是一個(gè)前后端分離的項(xiàng)目。具有一個(gè)在線點(diǎn)餐系統(tǒng)該有的所有功能,感興趣的朋友快來看看吧2022-01-01Java中的Static class詳解及實(shí)例代碼
這篇文章主要介紹了 Java中的Static class詳解及實(shí)例代碼的相關(guān)資料,在Java中我們可以有靜態(tài)實(shí)例變量、靜態(tài)方法、靜態(tài)塊。類也可以是靜態(tài)的,需要的朋友可以參考下2017-03-03