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