重学SpringBoot3-Problemdetails

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》
期待您的点赞👍收藏⭐评论✍

重学SpringBoot3-Problemdetails

  • Problem Details的概念
  • ProblemDetails配置类
  • 在Spring Boot 3中使用Problem Details
    • 未配置Problem Details
    • 配置Problem Details
    • 自定义异常处理器
    • 自定义Problem Details
    • 自定义异常继承 ErrorResponseException
  • 实践建议

随着 Spring Boot 3 的发布,Spring Framework 6 继续在提升开发者体验和应用性能方面迈出重要步伐。在众多引人注目的新特性中,对 Problem Details(问题详情)的支持尤为值得关注。这一特性基于 RFC 7807 标准,旨在为 HTTP API 提供一种标准化的错误响应格式。本文将深入探讨 Spring Boot 3 中 Problem Details 的概念、应用及其对微服务架构的潜在影响。

Problem Details的概念

RFC 7807: https://www.rfc-editor.org/rfc/rfc7807

在 RESTful 架构的 API 设计中,如何有效地表达错误信息一直是一个挑战。RFC 7807 定义的 Problem Details 机制提供了一种标准化的方式,通过具体、一致的格式来传达错误信息,使得客户端能够更容易地理解和处理 API 响应中的错误。

一个典型的 Problem Details 响应包含以下几个基本字段:

  • type:一个URI,指向错误类型的详细描述文档(可选)。
  • title:简短、人类可读的错误概述。
  • status:HTTP状态码。
  • detail:人类可读的解释,提供更多关于问题的细节。
  • instance:指向导致问题的具体请求或实例的URI(可选)。

ProblemDetails配置类

org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration.ProblemDetailsErrorHandlingConfiguration

当满足以下条件时,这个 Problem Details 配置类会被加载:

  1. 属性 spring.mvc.problemdetails.enabled 的值为 true;
  2. 没有其他相同类型的 Bean 被定义。

这个配置类中,定义了一个名为 problemDetailsExceptionHandler 的方法,该方法返回一个新的 ProblemDetailsExceptionHandler 类型实例,是一个标注了 @ControllerAdvice 集中处理系统异常。这个实例是继承自 ResponseEntityExceptionHandler ,用于处理控制器中的异常,并返回相应的错误信息。

ProblemDetailsExceptionHandler类

当前版本支持的异常类型,即如果系统出现以下异常,会被 SpringBoot 支持以 RFC 7807规范方式返回错误数据:

	@ExceptionHandler({HttpRequestMethodNotSupportedException.class,HttpMediaTypeNotSupportedException.class,HttpMediaTypeNotAcceptableException.class,MissingPathVariableException.class,MissingServletRequestParameterException.class,MissingServletRequestPartException.class,ServletRequestBindingException.class,MethodArgumentNotValidException.class,HandlerMethodValidationException.class,NoHandlerFoundException.class,NoResourceFoundException.class,AsyncRequestTimeoutException.class,ErrorResponseException.class,MaxUploadSizeExceededException.class,ConversionNotSupportedException.class,TypeMismatchException.class,HttpMessageNotReadableException.class,HttpMessageNotWritableException.class,MethodValidationException.class,BindException.class})

在Spring Boot 3中使用Problem Details

Spring Boot 3 中引入了对 Problem Details 的支持,使得开发者可以轻松地在自己的应用中应用这一标准。通过使用 Spring Boot 提供的工具和注解,你可以快速地为你的 API 添加对 Problem Details 的支持,从而提升 API 的可用性和易用性。

未配置Problem Details

例如对一个 仅支持 POST 请求的接口采用 GET 方式调用,如果是 HTML 页面展示则会出现白页:

HTML页面

如果是获取 JSON 则返回如下信息:

JSON 格式

配置Problem Details

在 Spring Boot 3 应用中,首先确保你的项目引入了 Spring Boot 的 Web 模块。

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>

配置文件中开启 Problem Details:

spring.mvc.problemdetails.enabled=true

开启Problem Details

自定义异常处理器

可以通过定义异常处理器来使用 Problem Details,并且支持自定义异常。

首先看下,如果系统发生了不支持的异常类型,就不能被处理成符合 Problem Details 标准的响应:

java.lang.ArithmeticException: / by zero

不支持的异常

接下来,通过定义异常处理器支持这个除零异常:

import org.springframework.http.HttpStatus;
import org.springframework.http.ProblemDetail;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;import java.net.URI;/*** @author CoderJia* @create 2024/03/15 10:00* @Description**/
@RestControllerAdvice(basePackages = "com.coderjia.springboot304web.controller")
public class GlobalExceptionHandler {@ExceptionHandler(ArithmeticException.class)public ProblemDetail handleCustomException(ArithmeticException ex) {ProblemDetail problemDetail = ProblemDetail.forStatusAndDetail(HttpStatus.INTERNAL_SERVER_ERROR, ex.getMessage());problemDetail.setTitle("服务器发生异常");problemDetail.setType(URI.create("https://coderjia.cn/errors/xxx"));return problemDetail;}
}

发生此类异常显示如下:

定义异常处理器

自定义Problem Details

除了标准字段 typetitlestatusdetailinstance 外,还可以通过 setProperty() 自定义一些属性:

    @ExceptionHandler(ArithmeticException.class)public ProblemDetail handleCustomException(ArithmeticException ex) {ProblemDetail problemDetail = ProblemDetail.forStatusAndDetail(HttpStatus.INTERNAL_SERVER_ERROR, ex.getMessage());problemDetail.setTitle("服务器发生异常");problemDetail.setType(URI.create("https://coderjia.cn/errors/xxx"));problemDetail.setProperty("errorCategory", "Generic");problemDetail.setProperty("timestamp", Instant.now());return problemDetail;}

image-20240315100658635

自定义异常继承 ErrorResponseException

除了以上方法,还可以直接继承 ErrorResponseException ,然后直接抛出该异常,会被处理成符合 Problem Details 标准的响应。

import org.springframework.http.HttpStatus;
import org.springframework.http.ProblemDetail;
import org.springframework.web.ErrorResponseException;import java.net.URI;
import java.time.Instant;/*** @author CoderJia* @create 2024/03/15 9:39* @Description**/
public class DivideByZeroException extends ErrorResponseException {public DivideByZeroException(String customMsg) {super(HttpStatus.NOT_FOUND, asProblemDetail(customMsg), null);}private static ProblemDetail asProblemDetail(String customMsg) {ProblemDetail problemDetail = ProblemDetail.forStatusAndDetail(HttpStatus.INTERNAL_SERVER_ERROR, customMsg);problemDetail.setTitle("除零异常");problemDetail.setType(URI.create("https://coderjia.cn/errors/xxx"));problemDetail.setProperty("timestamp", Instant.now());return problemDetail;}
}

直接抛出异常

获取正常

实践建议

使用 Problem Details 的主要优点是提高了 API 错误处理的一致性和可理解性。通过提供标准化的错误响应格式,客户端开发者可以更容易地理解和处理 API 返回的错误信息。在实践中,建议为你的 API 定义一套统一的错误类型,并为这些错误类型提供详细的文档。这样,当 API 返回错误时,客户端开发者可以通过 type 字段提供的 URI 访问到关于错误类型的详细说明,从而更好地理解和处理错误。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/747097.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Java+SpringBoot+vue的图书购物商城系统详细设计和实现

基于JavaSpringBootvue的图书购物商城系统详细设计和实现 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文…

操作多级(一、二、三级)指针才是我们的该有的姿态~

Hello&#xff0c;很有缘在这篇文章上我们相遇了&#xff0c;那么我就用题目巩固我们多级指针的知识&#xff0c;当然这里的题目是比较有点难度的&#xff0c;我们需要有点基础呀&#xff0c;如果你能轻松理解题目那说明你对指针的了解已经很有基础了呢&#xff0c;那废话不多说…

Observability:可观测性的新兴趋势:GAI、AIOps、工具整合和 OpenTelemetry

作者&#xff1a;来自 Elastic Gagan Singh 查看我们 2024 年对 500 多名可观察性决策者进行的调查结果&#xff0c;了解行业的发展方向。 随着技术的快速发展&#xff0c;可观察性也在快速发展。 可观察性对于推动积极的业务成果变得至关重要&#xff0c;我们希望了解用户如…

点餐平台网站|基于springboot框架+ Mysql+Java+Tomcat的点餐平台网站设计与实现(可运行源码+数据库+设计文档+部署说明)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 管理员功能登录前台功能效果图 用户功能实现 系统功能设计 数据库E-R图设计 lunwen参…

七月论文审稿GPT第3.2版和第3.5版:通过paper-review数据集分别微调Mistral、gemma

前言 我司第二项目组一直在迭代论文审稿GPT(对应的第二项目组成员除我之外&#xff0c;包括&#xff1a;阿荀、阿李、鸿飞、文弱等人)&#xff0c;比如 七月论文审稿GPT第1版&#xff1a;通过3万多篇paper和10多万的review数据微调RWKV七月论文审稿GPT第2版&#xff1a;用一万…

结构体之成绩统计2

题目描述 有N个学生,每个学生的数据包括学号、姓名、3门课的成绩,从键盘输入N个学生的数据,要求打印出3门课的总平均成绩,以及最高分的学生的数据(包括学号、姓名、3门课成绩) 输入格式 学生数量N占一行每个学生的学号、姓名、三科成绩占一行,空格分开。 输出格式 各门…

使用CIP采集欧姆龙EtherNet/IP从入门到精通

本文将会从以下几个方面介绍 1.CIP是什么 2.EtherNet/IP通信是什么 3.CIP通信报文解析 4.使用CIP常用的方法和功能介绍&#xff08;UCMM&#xff09; 5.自己封装了一个类&#xff0c;只要知道标签名称&#xff0c;和数据类型即可读写数据 6.demo展示 1.CIP是什么 CIP通信…

【C#】【SAP2000】读取SAP2000中frame单元列表到Grasshopper中

private void RunScript(bool build, ref object p1, ref object p2, ref object Profile, ref object stressRatio, ref object temperatureLoad, ref object displacement, ref object frameList){if (build true){// 声明变量int ret;int Numit 0;int[] ObjType new int[…

【Datawhale组队学习:Sora原理与技术实战】使用KAN-TTS合成女生沪语音频

Sambert-Hifigan模型介绍 拼接法和参数法是两种Text-To-Speech(TTS)技术路线。近年来参数TTS系统获得了广泛的应用&#xff0c;故此处仅涉及参数法。 参数TTS系统可分为两大模块&#xff1a;前端和后端。 前端包含文本正则、分词、多音字预测、文本转音素和韵律预测等模块&am…

无序安装任何检测工具,检测端口是否打开

Linux中有个特殊的设备文件&#xff1a; /dev/tcp 允许通过该接口进行tcp网络通讯 例子&#xff1a; 测试某一台远程机器的22端口是否打开&#xff1a; echo > /dev/tcp/127.0.0.1/22 如果没有任何输出&#xff0c;则端口开放&#xff0c; 否则没有开放 利用bash 脚本批…

SLAM基础-因子图优化

前言&#xff1a; 因子图优化和BA优化、位姿图优化一样&#xff0c;其本质都是解决非线性优化的问题。如果只有路标和位姿之间的因子&#xff0c;和BA优化完全一样。不过因子图是个大筐&#xff0c;什么约束都能加&#xff0c;IMU&#xff0c;轮速计&#xff0c;GPS。 在当前…

利用数据驱动的MEG分析方法提取fMRI静息态网络

摘要 静息态网络(RSN)的电生理基础仍存在争议。特别是&#xff0c;尚未确定一个能够同样有效解释所有静息态网络的原理性机制。虽然脑磁图(MEG)和脑电图(EEG)是确定RSN电生理基础的首选方法&#xff0c;但目前没有标准的RSN分析流程。本文比较了从MEG数据中提取RSNs的两种现有…

YOLOv7_pose-Openvino和ONNXRuntime推理【CPU】

纯检测系列&#xff1a; YOLOv5-Openvino和ONNXRuntime推理【CPU】 YOLOv6-Openvino和ONNXRuntime推理【CPU】 YOLOv8-Openvino和ONNXRuntime推理【CPU】 YOLOv7-Openvino和ONNXRuntime推理【CPU】 YOLOv9-Openvino和ONNXRuntime推理【CPU】 跟踪系列&#xff1a; YOLOv5/6/7-O…

如何打造知识管理平台,只需了解这几点

随着企业的发展&#xff0c;知识资源日益丰富和复杂&#xff0c;如果不加以有效管理和整合&#xff0c;这些知识很可能会被埋没或丢失。打造知识管理平台可以将这些知识资源进行统一存储和分类&#xff0c;便于员工查找和使用&#xff0c;从而充分发挥知识的价值。有很多工具可…

细说C++反向迭代器:原理与用法

文章目录 一、引言二、反向迭代器的原理与实现细节三、模拟实现C反向迭代器反向迭代器模板类的设计反向迭代器的使用示例与测试 一、引言 迭代器与反向迭代器的概念引入 迭代器&#xff08;Iterator&#xff09;是C标准模板库&#xff08;STL&#xff09;中的一个核心概念&am…

matplotlib-直方图

日期&#xff1a;2024.03.114 内容&#xff1a;将matplotlib的常用方法做一个记录&#xff0c;方便后续查找。 # 引入需要的库 from matplotlib import pyplot as plt import numpy as np# 设置画布大小 plt.figure(figsize (20,8),dpi 200)# 全局设置中文字体 plt.rcParams…

Android NDK入门:在应用中加入C和C++的力量

目录 ​编辑 引 NDK的设计目的 与Java/Kotlin的结合 使用场景 开发流程 设置项目以支持NDK 编写本地代码 使用JNI连接本地代码和Java/Kotlin代码 编译和运行你的应用 附 引 自诩方向是android方向的移动端开发工程师&#xff0c;却从来没有真正仔细了解过NDK&#…

Swift:.ignoresSafeArea():自由布局的全方位掌握

ignoresSafeArea(_ regions : edges:)修饰符的说明 SwiftUI布局系统会调整视图的尺寸和位置&#xff0c;以避免特定的安全区域。这就确保了系统内容&#xff08;比如软件键盘&#xff09;或设备边缘不会遮挡您的视图。要将您的内容扩展到这些区域&#xff0c;您可以通过应用该修…

植物神经功能紊乱患者每天从5片黛力新减少至2片,只因找对了治疗方法!

植物神经功能紊乱是一种常见的心理疾病&#xff0c;其症状包括焦虑、失眠、疲劳、头痛、胃肠不适等&#xff0c;给患者带来很大的困扰。然而&#xff0c;这种疾病是可以治疗的。本文将介绍一位植物神经功能紊乱患者的治疗经历&#xff0c;希望能够帮助更多的人了解和治疗此病。…