為你Springboot項目自定義一個通用的異常
前言
我們的項目通常來講都是一個比較大的項目,包含了各種各樣的服務。如果每個服務都以不同的方式返回異常信息,這樣排查的時候就會比較凌亂。如果我們定義一個標準的異常處理體系。并在所有的服務中使用。那樣開發(fā)起來就可以快速定位。頁面也會更加的簡單和直觀。
本文開發(fā)環(huán)境基于springboot2.4,IDE環(huán)境是IDEA。這里從一個最簡單的異常案例。逐步過渡到完全自定義自己的異常。
案例:Springboot查詢數(shù)據(jù)庫數(shù)據(jù),發(fā)現(xiàn)返回的是null,就拋出異常。
OK,基于這個思想,看一下實現(xiàn)的思路。
一、簡單案例代碼實現(xiàn)
1、新建一個Springboot應用
2、新建dao包,創(chuàng)建User類
這個比較簡單,代碼如下:
- public class User {
- private int id;
- private String name;
- public User() {
- }
- public User(int id, String name) {
- this.id = id;
- this.name = name;
- }
- //getter和setter方法
- //toString方法
- }
3、新建service包,創(chuàng)建UserService
- @Service
- public class UserService {
- public User findOne(int id){
- //本來應該向數(shù)據(jù)庫查詢User,但是數(shù)據(jù)庫沒有
- return null;
- }
- }
由于演示的是異常的案例,因此這里沒有真正實現(xiàn)數(shù)據(jù)庫的增刪改查操作。當調用findOne方法時,直接返回為null即可。
4、新建controller包,創(chuàng)建UserController類
- @RestController
- public class UserController {
- @Autowired
- private UserService service;
- @GetMapping("/users/{id}")
- public User retriveUser(@PathVariable int id)
- throws UserNotFoundException {
- User user= service.findOne(id);
- if(user==null)
- throw new UserNotFoundException("id: "+ id);
- return user;
- }
- }
這里自定義了一個異常UserNotFoundException,當數(shù)據(jù)庫查詢的時候一旦發(fā)現(xiàn)返回值為null,就直接拋出這個異常。
5、在controller包下,創(chuàng)建UserNotFoundException類
- public class UserNotFoundException extends RuntimeException {
- public UserNotFoundException(String message){
- super(message);
- System.out.println("異常信息是:"+message);
- }
- }
6、postman測試
這時候進行測試會發(fā)現(xiàn)服務器代碼會報錯。我們的資源沒有找到總不能提示服務器內部錯誤吧?,F(xiàn)在對拋出的異常進行一個處理。
7、異常處理
- @ResponseStatus(HttpStatus.NOT_FOUND)
- public class UserNotFoundException extends RuntimeException {
- public UserNotFoundException(String message){
- super(message);
- System.out.println("異常信息是:"+message);
- }
- }
我們將添加一個注釋@ResponseStatus來生成狀態(tài):404 Not Found。當然還有其他的狀態(tài)。這個可以根據(jù)自己的需要去返回。我們使用了HttpStatus.NOT_FOUND用戶訪問的時候,一旦拋出了異常就會顯示404錯誤。這個你換成其他的狀態(tài),還會顯示其他的信息。
8、重新測試
Spring Boot和Spring MVC框架的結合提供了錯誤處理。其內部已經自動配置一些默認異常處理。所以在開發(fā)中為所有服務配置一致的異常消息是很重要的。
二、通用的異常處理
1、添加依賴
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-webmvc</artifactId>
- <version>5.3.2</version>
- </dependency>
2、創(chuàng)建異常返回實體類ExceptionResponse
這個類的作用是,當有異常時,我們想要展示的信息。
- public class ExceptionResponse {
- private Date timestamp;
- private String message;
- private String detail;
- public ExceptionResponse() { }
- public ExceptionResponse(Date timestamp, String message, String detail) {
- this.timestamp = timestamp;
- this.message = message;
- this.detail = detail;
- }
- public Date getTimestamp() {
- return timestamp;
- }
- public String getMessage() {
- return message;
- }
- public String getDetail() {
- return detail;
- }
- }
這里只需要實現(xiàn)getter方法,setter方法就不需要。
3、創(chuàng)建通用異常處理類
- @ControllerAdvice
- @RestController
- public class CustomizedResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {
- //此方法主要處理所有的異常信息
- @ExceptionHandler(Exception.class)
- public final ResponseEntity<Object> handleAllExceptions(Exception ex, WebRequest request) {
- //當出現(xiàn)異常時,我們輸出的信息,這里被封裝在了ExceptionResponse
- ExceptionResponse exceptionResponse = new ExceptionResponse(new Date(), ex.getMessage(), request.getDescription(false));
- return new ResponseEntity(exceptionResponse, HttpStatus.INTERNAL_SERVER_ERROR);
- }
- //當頁面資源沒有找到時,拋出的異常
- @ExceptionHandler(UserNotFoundException.class)
- public final ResponseEntity<Object> handleUserNotFoundExceptions(UserNotFoundException ex, WebRequest request) {
- ExceptionResponse exceptionResponse = new ExceptionResponse(new Date(), ex.getMessage(), request.getDescription(false));
- return new ResponseEntity(exceptionResponse, HttpStatus.NOT_FOUND);
- }
- }
很簡單。里面有很多API,可以自己根據(jù)需要去查即可。
4、postman測試
萬事大吉。趕快為你的程序自定義一個通用的異常處理程序吧。
本文轉載自微信公眾號「愚公要移山」,可以通過以下二維碼關注。轉載本文請聯(lián)系愚公要移山公眾號。