如何優(yōu)雅的處理Spring Boot異常信息詳解
Spring Boot 異常處理
異常處理是一種識(shí)別并響應(yīng)錯(cuò)誤的一致性機(jī)制,異常機(jī)制可以把程序中的異常處理代碼和正常的業(yè)務(wù)邏輯代碼分離,包裝程序的可讀性和健壯性。在Spring Boot應(yīng)用程序中,能夠捕獲并及時(shí)的響應(yīng)客戶端的錯(cuò)誤操作是一件非常重要的事情。在本章節(jié)中,我將展示如何處理Spring Boot中的異常。
1. 相關(guān)注解說(shuō)明
在進(jìn)行演示之前,我們先了解一下在Spring Boot應(yīng)用程序中與異常處理相關(guān)的幾個(gè)注解
| 注解名稱 | 說(shuō)明 |
|---|---|
| @ControllerAdvice | 該標(biāo)簽用于處理全局的異常信息 |
| @ExceptionHadler | 用于處理特定異常信息,并返回相關(guān)的響應(yīng)到客戶端 |
首先,我們需要使用**@ControllerAdvice**注解來(lái)定義一個(gè)全局的異常信息處理類,其語(yǔ)法如下:
package com.ramostear.exception.handler;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
/**
* @author : ramostear
* @date : 2019/3/6 0006-16:33
*/
@ControllerAdvice
public class UserExceptionHandler {
//TODO ...
}
接下來(lái),我們需要定義一個(gè)擴(kuò)展了RuntimeException類的自定義異常處理類:
package com.ramostear.exception.handler;
/**
* @author : ramostear
* @date : 2019/3/6 0006-16:31
*/
public class UserNotFoundException extends RuntimeException{
private static final long serialVersionUID = 5534028121297403043L;
}
最后,我們使用**@ExceptionHandler**注解來(lái)定義一個(gè)處理具體異常信息的方法,其語(yǔ)法如下:
@ExceptionHandler(value = UserNotFoundException.class)
public ResponseEntity<Object> exception(UserNotFoundException ex){
return new ResponseEntity<>("user not found.", HttpStatus.NOT_FOUND);
}
以上工作準(zhǔn)備完成之后,我們可以使用如下的方式來(lái)處理API中的異常信息:
@GetMapping("/users/{id}")
public ResponseEntity<Object> getUser(@PathVariable(name = "id") long id){
if(!userRepo.containsKey ( id )){
throw new UserNotFoundException ();
}
return new ResponseEntity<> (userRepo.get (id), HttpStatus.OK);
}
接下來(lái)的內(nèi)容當(dāng)中,我將給出完整的示例代碼,使用HTTP GET方法請(qǐng)求一個(gè)用戶信息,當(dāng)用戶存儲(chǔ)庫(kù)中沒(méi)有相應(yīng)的用戶信息時(shí),返回“user not found”提示信息。
2. 自定義異常信息類 — UserNotFoundException.java
package com.ramostear.exception.handler;
/**
* @author : ramostear
* @date : 2019/3/6 0006-16:31
*/
public class UserNotFoundException extends RuntimeException{
private static final long serialVersionUID = 5534028121297403043L;
}
說(shuō)明:這里只是做了一個(gè)簡(jiǎn)單的擴(kuò)展
2. 全局異常處理類 —UserExceptionHandler.java
package com.ramostear.exception.handler;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
/**
* @author : ramostear
* @date : 2019/3/6 0006-16:33
*/
@ControllerAdvice
public class UserExceptionHandler {
@ExceptionHandler(value = UserNotFoundException.class)
public ResponseEntity<Object> exception(UserNotFoundException ex){
return new ResponseEntity<>("user not found.", HttpStatus.NOT_FOUND);
}
}
在UserExceptionHandler.java文件中,我們定義了一個(gè)處理用戶不存在異常的方法,
3. API類 — UserServiceController.java
package com.ramostear.exception.handler.controller;
import com.ramostear.exception.handler.UserNotFoundException;
import com.ramostear.exception.handler.model.User;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.Map;
/**
* @author : ramostear
* @date : 2019/3/6 0006-16:26
*/
@RestController
public class UserServiceController {
private static Map<Long,User> userRepo = new HashMap<>();
@PostConstruct
public void initUserRepo(){
User admin = new User ().setId ( 1 ).setName ( "admin" );
userRepo.put ( admin.getId (),admin );
User editor = new User ().setId ( 2 ).setName ( "editor" );
userRepo.put ( editor.getId (),editor );
}
@GetMapping("/users/{id}")
public ResponseEntity<Object> getUser(@PathVariable(name = "id") long id){
if(!userRepo.containsKey ( id )){
throw new UserNotFoundException ();
}
return new ResponseEntity<> (userRepo.get (id), HttpStatus.OK);
}
}
在getUser()方法中,如果用戶沒(méi)有找到,則拋出UserNotFoundException異常。
4. 應(yīng)用主類 —ExceptionHandlerApplication.java
package com.ramostear.exception.handler;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ExceptionHandlerApplication {
public static void main(String[] args) {
SpringApplication.run(ExceptionHandlerApplication.class, args);
}
}
5. 用戶POJO類 — User.java
package com.ramostear.exception.handler.model;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
/**
* @author : ramostear
* @date : 2019/3/6 0006-16:23
*/
@Getter
@Setter
@NoArgsConstructor
public class User {
private long id;
private String name;
public User setId(long id){
this.id = id;
return this;
}
public User setName(String name){
this.name = name;
return this;
}
}
6. Maven構(gòu)建文件 — pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.3.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.ramostear</groupId> <artifactId>exception-handler</artifactId> <version>0.0.1-SNAPSHOT</version> <name>exception-handler</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
8. 運(yùn)行測(cè)試
接下來(lái),我們將打包運(yùn)行我們的程序,本次教程演示將使用IDEA來(lái)運(yùn)行程序,運(yùn)行結(jié)果如下圖所示:

然后,啟動(dòng)Postman應(yīng)用程序,我們先在地址欄輸入:http://localhost:8080/users/1 ,觀察正常情況下的測(cè)試信息:

Postman的測(cè)試結(jié)果顯示,請(qǐng)求狀態(tài)為200,且返回了用戶的詳細(xì)信息?,F(xiàn)在,我們更新URL為:http://localhost:8080/users/3 ,再次觀察測(cè)試結(jié)果:

此時(shí)的HTTP Status為404,且返回了“user not found.”的提示信息。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Spring下token過(guò)期時(shí)間分平臺(tái)(web和app)設(shè)置方法
本文詳細(xì)介紹了在Spring環(huán)境下,針對(duì)web端和APP端實(shí)現(xiàn)不同token過(guò)期時(shí)間的方法,通過(guò)整合SpringBoot、springSecurity和JWT框架,文章講解了登錄流程、JWT的基本組成以及token鑒權(quán)的核心步驟,需要的朋友可以參考下2024-10-10
Java實(shí)戰(zhàn)之在線租房系統(tǒng)的實(shí)現(xiàn)
這篇文章主要介紹了利用Java實(shí)現(xiàn)的在線租房系統(tǒng),文中用到了SpringBoot、Redis、MySQL、Vue等技術(shù),文中示例代碼講解詳細(xì),需要的可以參考一下2022-02-02
Java方法重寫_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
在Java和其他一些高級(jí)面向?qū)ο蟮木幊陶Z(yǔ)言中,子類可繼承父類中的方法,而不需要重新編寫相同的方法。但有時(shí)子類并不想原封不動(dòng)地繼承父類的方法,而是想作一定的修改,這就需要采用方法的重寫。方法重寫又稱方法覆蓋,下文給大家介紹java方法重寫及重寫規(guī)則,一起學(xué)習(xí)吧2017-04-04
idea創(chuàng)建包含多個(gè)springboot module的maven project的方法
這篇文章主要介紹了idea創(chuàng)建包含多個(gè)springboot module的maven project的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
【MyBatis源碼全面解析】MyBatis一二級(jí)緩存介紹
下面小編就為大家?guī)?lái)一篇【MyBatis源碼全面解析】MyBatis一二級(jí)緩存介紹。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06
mybatis通過(guò)TypeHandler?list轉(zhuǎn)換string類型轉(zhuǎn)換方式
這篇文章主要介紹了mybatis通過(guò)TypeHandler?list轉(zhuǎn)換string類型轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
Java使用Queryable-pageable實(shí)現(xiàn)分頁(yè)效果
這篇文章主要為大家介紹了Java如何使用Queryable-pageable從而實(shí)現(xiàn)分頁(yè)效果,文中的示例代碼簡(jiǎn)潔易懂,感興趣的小伙伴可以動(dòng)手嘗試一下2022-06-06
Java設(shè)計(jì)模式之建造者模式(Builder模式)介紹
這篇文章主要介紹了Java設(shè)計(jì)模式之建造者模式(Builder模式)介紹,本文講解了為何使用建造者模式、如何使用建造者模式、Builder模式的應(yīng)用等內(nèi)容,需要的朋友可以參考下2015-03-03
解決偶現(xiàn)的MissingServletRequestParameterException異常問(wèn)題
這篇文章主要介紹了解決偶現(xiàn)的MissingServletRequestParameterException問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10

