此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Framework 6.1.10! |
此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Framework 6.1.10! |
REST服务的常见要求是在错误正文中包含详细信息 反应。Spring Framework 支持“HTTP API 的问题详细信息” 规范,RFC 7807。
以下是此支持的主要抽象:
-
ProblemDetail
— RFC 7807 问题详细信息的表示;一个简单的容器 对于规范中定义的标准字段和非标准字段。 -
ErrorResponse
— 公开 HTTP 错误响应详细信息(包括 HTTP)的合约 状态、响应标头和 RFC 7807 格式的正文;这允许例外 封装并公开它们如何映射到 HTTP 响应的详细信息。所有 Spring WebFlux 例外实现这一点。 -
ErrorResponseException
— 其他人的基本实现 可以用作方便的基类。ErrorResponse
-
ResponseEntityExceptionHandler
— 方便的基类,用于处理所有 Spring WebFlux 异常的@ControllerAdvice, 和 any ,并使用 body 呈现错误响应。ErrorResponseException
呈现
您可以返回或从任何或从
呈现 RFC 7807 响应的任何方法。其处理方式如下:ProblemDetail
ErrorResponse
@ExceptionHandler
@RequestMapping
-
的属性确定 HTTP 状态。
status
ProblemDetail
-
的属性是从当前 URL 路径设置的,如果不是 已经设置好了。
instance
ProblemDetail
-
对于内容协商,杰克逊更喜欢 “application/problem+json”在“application/json”上呈现 , 如果没有找到兼容的媒体类型,也可以回退到它。
HttpMessageConverter
ProblemDetail
要启用 RFC 7807 对 Spring WebFlux 异常和任何 的响应,请在 Spring 配置中扩展并声明为@ControllerAdvice。处理程序
有一个处理任何异常的方法,它
包括所有内置的 Web 例外。您可以添加更多异常处理方法,以及
使用受保护的方法将任何异常映射到 .ErrorResponseException
ResponseEntityExceptionHandler
@ExceptionHandler
ErrorResponse
ProblemDetail
非标准字段
您可以通过以下两种方式之一使用非标准字段扩展 RFC 7807 响应。
一、插入到的“属性”中。使用杰克逊时
库,Spring Framework 寄存器可以确保这一点
“properties”被解包并呈现为顶级 JSON 属性
响应,同样,反序列化期间的任何未知属性都会插入到
这。Map
ProblemDetail
ProblemDetailJacksonMixin
Map
Map
您还可以扩展以添加专用的非标准属性。
中的复制构造函数允许子类易于创建
从现有的 .这可以集中完成,例如,从将异常重新创建到具有附加非标准字段的子类中。ProblemDetail
ProblemDetail
ProblemDetail
@ControllerAdvice
ResponseEntityExceptionHandler
ProblemDetail
国际化
国际化错误响应细节和良好做法是一项常见要求 自定义 Spring WebFlux 异常的问题详细信息。支持如下:
-
每个都公开一个消息代码和参数来解析“详细信息”字段 通过 MessageSource。 实际的消息代码值使用占位符进行参数化,例如 从参数中扩展。
ErrorResponse
"HTTP method {0} not supported"
-
每个还公开一个消息代码来解析“title”字段。
ErrorResponse
-
ResponseEntityExceptionHandler
使用消息代码和参数来解析 “detail”和“title”字段。
默认情况下,“detail”字段的消息代码为“problemDetail”。 + 完全 限定的异常类名称。某些异常可能会暴露 哪种情况下,后缀将添加到默认消息代码中。下表列出了消息 Spring WebFlux 异常的参数和代码:
例外 | 消息代码 | 消息代码参数 |
---|---|---|
|
(默认) |
|
|
(默认值) + “.parseError” |
|
|
(默认) |
|
|
(默认) |
|
|
(默认) |
|
|
(默认) |
|
|
(默认值) + “.parseError” |
|
|
(默认) |
|
|
(默认) |
|
默认情况下,“title”字段的消息代码为“problemDetail.title.” + the full 限定的异常类名称。
例外 | 消息代码 | 消息代码参数 |
---|---|---|
|
(默认) |
|
|
(默认值) + “.parseError” |
|
|
(默认) |
|
|
(默认) |
|
|
(默认) |
|
|
(默认) |
|
|
(默认值) + “.parseError” |
|
|
(默认) |
|
|
(默认) |
|
客户端处理
客户端应用程序可以捕获 ,当使用 ,
或者当使用 时,并使用他们的方法将错误响应正文解码为任何目标类型,例如 ,或 的子类。WebClientResponseException
WebClient
RestClientResponseException
RestTemplate
getResponseBodyAs
ProblemDetail
ProblemDetail