關(guān)于SpringBoot使用@ExceptionHandler注解局部異常處理
介紹
在開發(fā) Web 應(yīng)用程序時(shí),異常處理是非常重要的一部分。SpringBoot 提供了多種方式來處理異常,其中之一是使用 @ExceptionHandler 注解進(jìn)行局部異常處理。使用 @ExceptionHandler 注解,我們可以在 Controller 層或方法級(jí)別上處理異常,而不用在整個(gè)應(yīng)用程序中處理。
@ExceptionHandler 注解
@ExceptionHandler 注解是 SpringFramework 提供的一個(gè)注解,用于處理控制器中出現(xiàn)的異常。當(dāng)在控制器方法中拋出異常時(shí),SpringBoot 會(huì)查找?guī)в?@ExceptionHandler 注解的方法,并調(diào)用它來處理異常。
下面是一個(gè)簡(jiǎn)單的例子:
@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 對(duì)象,包含了錯(cuò)誤響應(yīng)的狀態(tài)碼和消息,然后將其封裝在 ResponseEntity 對(duì)象中返回。
如何使用 @ExceptionHandler 注解進(jìn)行局部異常處理
要使用 @ExceptionHandler 注解進(jìn)行局部異常處理,請(qǐng)按照以下步驟操作:
第 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 對(duì)象,包含了錯(cuò)誤響應(yīng)的狀態(tài)碼和消息,然后將其封裝在 ResponseEntity 對(duì)象中返回。
示例
以下是一個(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 對(duì)象,包含了錯(cuò)誤響應(yīng)的狀態(tài)碼和消息,然后將其封裝在 ResponseEntity 對(duì)象中返回。
原理
當(dāng)控制器方法拋出異常時(shí),SpringBoot 會(huì)在控制器類中查找?guī)в?@ExceptionHandler 注解的方法,并調(diào)用它來處理異常。@ExceptionHandler 注解的方法必須具有以下特征:
- 方法必須是 public、沒有返回值,并且具有一個(gè)參數(shù),該參數(shù)類型為拋出的異常類型。
- 方法必須使用 @ExceptionHandler 注解進(jìn)行注解,該注解的參數(shù)為拋出的異常類型。
當(dāng)控制器方法拋出異常時(shí),SpringBoot 將異常傳遞給帶有 @ExceptionHandler 注解的方法。該方法將處理異常,并返回一個(gè) ResponseEntity 對(duì)象,該對(duì)象包含錯(cuò)誤響應(yīng)的狀態(tài)碼和消息。
總結(jié)
在本文中,我們介紹了 SpringBoot 中的 @ExceptionHandler 注解,演示了如何使用它進(jìn)行局部異常處理。使用 @ExceptionHandler 注解,我們可以在 Controller 層或方法級(jí)別上處理異常。當(dāng)控制器方法拋出異常時(shí),SpringBoot 會(huì)查找?guī)в?@ExceptionHandler 注解的方法,并調(diào)用它來處理異常。要使用 @ExceptionHandler 注解進(jìn)行局部異常處理,需要定義自定義異常、拋出異常和處理異常。
到此這篇關(guān)于關(guān)于SpringBoot使用@ExceptionHandler注解局部異常處理的文章就介紹到這了,更多相關(guān)@ExceptionHandler局部異常處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(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)文章
JAVA中@ApiModel和@ApiModelProperty注解實(shí)戰(zhàn)代碼
這篇文章主要給大家介紹了關(guān)于JAVA中@ApiModel和@ApiModelProperty注解的相關(guān)資料,@ApiModel注解是用在接口相關(guān)的實(shí)體類上的注解,它主要是用來對(duì)使用該注解的接口相關(guān)的實(shí)體類添加額外的描述信息,常常和@ApiModelProperty注解配合使用,需要的朋友可以參考下2024-03-03
SpringBoot整合Java DL4J實(shí)現(xiàn)文本分類系統(tǒng)
在當(dāng)今信息爆炸的時(shí)代,自然語言處理領(lǐng)域中的文本分類顯得尤為重要,文本分類能夠高效地組織和管理海量的文本數(shù)據(jù),隨著互聯(lián)網(wǎng)的飛速發(fā)展,我們每天都被大量的文本信息所包圍,本文將介紹如何使用 Spring Boot 整合 Java Deeplearning4j 來構(gòu)建一個(gè)文本分類系統(tǒng)2024-10-10
java 中用split分割字符串,最后的空格等不被拆分的方法
下面小編就為大家?guī)硪黄猨ava 中用split分割字符串,最后的空格等不被拆分的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-02-02
SpringBoot異常: nested exception is java.lang.NoClassDefFoundE
這篇文章主要介紹了SpringBoot異常: nested exception is java.lang.NoClassDefFoundError: javax/servlet/ServletContext解決方案,說明了錯(cuò)誤原因和解決方案,需要的朋友可以參考下2021-06-06
Spring+Mybatis動(dòng)態(tài)切換數(shù)據(jù)源的方法
這篇文章主要為大家詳細(xì)介紹了Spring+Mybatis動(dòng)態(tài)切換數(shù)據(jù)源的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01

