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