如何优雅的处理Spring Boot异常信息详解
作者:罗摩尔 发布时间:2023-11-29 09:50:02
Spring Boot 异常处理
异常处理是一种识别并响应错误的一致性机制,异常机制可以把程序中的异常处理代码和正常的业务逻辑代码分离,包装程序的可读性和健壮性。在Spring Boot应用程序中,能够捕获并及时的响应客户端的错误操作是一件非常重要的事情。在本章节中,我将展示如何处理Spring Boot中的异常。
1. 相关注解说明
在进行演示之前,我们先了解一下在Spring Boot应用程序中与异常处理相关的几个注解
注解名称 | 说明 |
---|---|
@ControllerAdvice | 该标签用于处理全局的异常信息 |
@ExceptionHadler | 用于处理特定异常信息,并返回相关的响应到客户端 |
首先,我们需要使用**@ControllerAdvice**注解来定义一个全局的异常信息处理类,其语法如下:
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 ...
}
接下来,我们需要定义一个扩展了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**注解来定义一个处理具体异常信息的方法,其语法如下:
@ExceptionHandler(value = UserNotFoundException.class)
public ResponseEntity<Object> exception(UserNotFoundException ex){
return new ResponseEntity<>("user not found.", HttpStatus.NOT_FOUND);
}
以上工作准备完成之后,我们可以使用如下的方式来处理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);
}
接下来的内容当中,我将给出完整的示例代码,使用HTTP GET方法请求一个用户信息,当用户存储库中没有相应的用户信息时,返回“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;
}
说明:这里只是做了一个简单的扩展
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文件中,我们定义了一个处理用户不存在异常的方法,
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()方法中,如果用户没有找到,则抛出UserNotFoundException异常。
4. 应用主类 —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构建文件 — 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. 运行测试
接下来,我们将打包运行我们的程序,本次教程演示将使用IDEA来运行程序,运行结果如下图所示:
然后,启动Postman应用程序,我们先在地址栏输入:http://localhost:8080/users/1 ,观察正常情况下的测试信息:
Postman的测试结果显示,请求状态为200,且返回了用户的详细信息。现在,我们更新URL为:http://localhost:8080/users/3 ,再次观察测试结果:
此时的HTTP Status为404,且返回了“user not found.”的提示信息。
来源:https://juejin.im/post/5caddb255188251b2c397731
猜你喜欢
- 目录基于Java的guava开源库工具类1、guava的maven配置引入 2、LoadingCache3、Multimap 和
- 本文实例讲述了Java文本文件操作方法。分享给大家供大家参考。具体分析如下:最初Java是不支持对文本文件的处理的,为了弥补这个缺憾而引入了
- 一,栈1,概念在我们软件应用 ,栈这种后进先出数据结构的应用是非常普遍的。比如你用浏 览器上网时不管什么浏览器都有 个"后退&qu
- 本文实例讲述了Android编程实现wifi扫描及连接的方法。分享给大家供大家参考,具体如下:主界面,搜索附近WIFI信息/** * Sea
- 话不多说,上来就是干!?1234567891011121314151617181920212223242526272829303132333
- 本文想阐述一下当你开发Android应用并采用RxJava作为你的架构,尤其是有关网络请求时最常见的三种场景。我使用Retrofit来作为网
- Android的主线程中执行长时间操作,导致界面无响应,会引起ANR。如果需要执行较长时间的操作,一般会在另一个线程处理,然后将数据转交给主
- 自定义starterSpringBoot中的starter是一种非常重要的机制,能够抛弃以前繁杂的配置,将其统一集成进 starter,应用
- 优点1.一个调用者想创建一个对象,只要知道其名称就可以了。2.扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。3.屏蔽产品的具体实现
- 前言CMake是一个跨平台的安装编译工具,可以用简单的语句来描述所有平台的安装(编译过程)。CMake可以说已经成为大部分C++开源项目标配
- 本文实例讲述了Java使用备忘录模式实现过关类游戏功能。分享给大家供大家参考,具体如下:一.模式定义备忘录模式,在不破坏封闭的前提下,捕获一
- 本文实例讲述了C#基于基姆拉尔森算法计算指定日期是星期几的方法。分享给大家供大家参考。具体分析如下:基姆拉尔森计算公式 W= (d+2*m+
- 说点对这几个容易混淆的词的理解:1、c++中的virtual方法的 virtual关键字主要是防止继承中重复继承父类的同一个方法而设置的标识
- @RequestBody部分属性丢失问题描述JavaBean实现public class VerifyNewFriendApplyReq i
- 当前使用的IDEA版本是2020.1。随着IDEA版本的升级,有些插件不再支持,而有些插件变成了收费插件,这些插件将不再推荐。以下列举的,都
- java和javascript长得是如此地相像,那么它们是一回事儿吗?现在让我来揭晓答案吧!JavaScript 是一种嵌入式脚本文件,直接
- springBoot框架的特点就是舍去了繁琐的配置。使开发者可以把更多的精力放在业务逻辑的开发上。springBoot搭建分三步。1.创建一
- MybatisPlus特性•无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑•损耗小:启动即会自动注入基本 CURD,性能
- SnowFlake 算法,是 Twitter 开源的分布式 id 生成算法。其核心思想就是:使用一个 64 bit 的 long 型的数字作
- java向文件中追加内容与读写文件内容源码实例代码向文件尾加入内容有多种方法,常见的方法有两种:RandomAccessFile类可以实现随