重学SpringBoot3-Problemdetails

news2025/1/13 13:43:53

更多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.coloradmin.cn/o/1519628.html

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

相关文章

外包就干了2个月,技术退步明显....

先说情况&#xff0c;大专毕业&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试&#xf…

程序员必备开发工具、程序员必备集成开发环境(IDE)

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

鸿蒙Next学习-Flex布局

Entry Component struct FlexCase {build() {//需要在构造参数上传Flex({ direction: FlexDirection.Row,justifyContent:FlexAlign.Center }) {//flex布局Row().width(100).height(100).backgroundColor(Color.Red)Row().width(100).height(100).backgroundColor(Color.Yellow…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:NavRouter)

导航组件&#xff0c;默认提供点击响应处理&#xff0c;不需要开发者自定义点击事件逻辑。 说明&#xff1a; 该组件从API Version 9开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 必须包含两个子组件&#xff0c;其中第二个子组…

HTML基础:超链接的其他 4 种形式

你好&#xff0c;我是云桃桃。上次&#xff0c;我们聊了 HTML href 属性的网页链接&#xff0c;锚点链接&#xff0c;这次我们聊聊 href 其他 4 种常见链接。 1、电子邮件链接&#xff08;mailto&#xff09;&#xff1a; 通过 mailto: 创建一个链接&#xff0c;点击链接会自…

使用阿里云服务器查看网站备案的方法和注意事项

随着互联网的发展&#xff0c;网站注册已成为在中国建设网站的必要步骤。 在使用阿里云服务器时&#xff0c;我们可以通过以下步骤查看网站注册状态。 备案概述&#xff1a; 在中国&#xff0c;互联网信息服务提供者必须进行登记&#xff0c;以监管互联网内容、规范市场运营和…

Java 输入方法 数组

目录 一、输入方法1.常用方法2.Scanner的使用3.BufferedReader的使用 二、数组1.数组的定义静态初始化数组动态初始化数组多维数组 2.数组赋值机制3.数组拷贝使用循环逐元素拷贝使用 System.arraycopy() 方法使用 Arrays.copyOf() 方法 4.数组排序5.数组合并6.数组翻转7.基于范…

Kotlin编程权威指南学习知识点预览

一、变量、常量和类型&#xff1a; 变量、常量以及 Kotlin 基本数据类型。变量和常量在 应用程序中可用来储值和传递数据。类型则用来描述常量或变量中保存的是什么样的数据。 1、声明变量: // 变量定义关键字 —— 变量名 —— 类型定义 —— 赋值运算符 —— 赋值var na…

【Kafka面试演练】那Kafka消费者手动提交、自动提交有什么区别?

面试官&#xff1a;听说你精通Kafka&#xff0c;那我就考考你吧 面试官&#xff1a;不用慌尽管说&#xff0c;错了也没关系&#x1f60a;。。。 每日分享【大厂面试演练】&#xff0c;本期是《Kafka系列》&#xff0c;感兴趣就关注我吧❤️ 面试官&#xff1a;你先说说Kafka由什…

cuda cudnn安装

安装 cudnn是否安装成功 注意 cudnn对应的cuda的10.0版本无win11版本 下载win10 即可

linux系统关闭防火墙和SELINUX及配置网络

一&#xff0c;关闭防火墙和SELINUX 当我们进入界面后&#xff0c;输入用户名root&#xff0c;以及密码&#xff0c;密码我们是看不见的 然后输入指令cat -n /etc/sysconfig/selinux &#xff08;注意空格&#xff09; 输入指令 vi /etc/sysconfig/selinux &#xf…

杂七杂八111

MQ 用处 一、异步。可提高性能和吞吐量 二、解耦 三、削峰 四、可靠。常用消息队列可以保证消息不丢失、不重复消费、消息顺序、消息幂等 选型 一Kafak:吞吐量最大&#xff0c;性能最好&#xff0c;集群高可用。缺点&#xff1a;会丢数据&#xff0c;功能较单一。 二Ra…

第十五届蓝桥杯模拟考试III_物联网设计与开发官方代码分析

目录 前言&#xff1a;显示界面部分&#xff1a; 前言&#xff1a; 这次模拟的效果很不好。85分&#xff0c;4h的限时我花了两天完成&#xff0c;这个时间是远远超出要求的&#xff0c;而且最后还只拿到56分&#xff0c;抛开分数高低不提&#xff0c;就这个用时属实蜗牛一样的速…

2024年【危险化学品经营单位安全管理人员】考试及危险化学品经营单位安全管理人员考试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 危险化学品经营单位安全管理人员考试根据新危险化学品经营单位安全管理人员考试大纲要求&#xff0c;安全生产模拟考试一点通将危险化学品经营单位安全管理人员模拟考试试题进行汇编&#xff0c;组成一套危险化学品经…

安装nginx

Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器&#xff0c;特点是占有内存少&#xff0c;并发能力强&#xff0c;事实上nginx的并发能力确实在同类型的网页服务器中表现较好&#xff0c;中国大陆使用nginx网站用户有&#xff1a;百度、京东、新浪、网易、腾…

2024/3/14打卡k倍区间(8届蓝桥杯)——前缀和+优化***

题目 给定一个长度为 N 的数列&#xff0c;A1,A2,…AN&#xff0c;如果其中一段连续的子序列 Ai,Ai1,…Aj 之和是 K 的倍数&#xff0c;我们就称这个区间 [i,j] 是 K 倍区间。 你能求出数列中总共有多少个 K 倍区间吗&#xff1f; 输入格式 第一行包含两个整数 N 和 K。 以下 N…

DeePhage:预测噬菌体的生活方式

GitHub - shufangwu/DeePhage: A tool for distinguish temperate phage-derived and virulent phage-derived sequence in metavirome data using deep learning 安装 conda create -n deephage conda activate deephage pip install numpy pip install h5py pip install ten…

淘宝联盟高级API - 超级搜索api接口, 淘宝联盟商品搜索接口

淘宝联盟商品库超级搜索api接口&#xff0c;支持搜索商品链接、商品id&#xff0c;商品标题搜索&#xff0c;还有更多强大搜索选项。 注意&#xff1a;接口默认只查【含有优惠券】的商品&#xff0c;如果需要精确搜索&#xff0c;请将 has_coupon 参数设置为 false 获取接口秘…

深入理解JMM

一、什么是JMM JMM&#xff08;java memory model&#xff09;Java内存模型&#xff1a;是java虚拟机规范中定义的一组规范&#xff0c;用于屏蔽掉各种硬件和操作系统的内存访问差异&#xff0c;以实现让JAVA程序在各平台都能达到一致的并发结果。其主要规定了线程和内存之间的…

苍穹外卖问题记录(持续更新)

Day01_3.2.4前后端联调 1. 前端无法登录 &#xff08;1&#xff09;确保nginx服务器已经启动 &#xff08;2&#xff09;查看自己数据库的用户名和密码是否和老师的一样&#xff0c;不一样的话需要在application-dev.yml文件中把老师的用户名密码修改成自己的 老师的用户名…