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