|
对于最新的稳定版本,请使用 Spring Framework 6.2.10! |
错误响应
REST 服务的一个常见要求是在错误正文中包含详细信息 反应。 Spring 框架支持“HTTP API 的问题详细信息”规范,RFC 9457。
以下是此支持的主要抽象:
-
ProblemDetail— RFC 9457 问题详细信息的表示;一个简单的容器适用于规范中定义的标准字段和非标准字段。 -
ErrorResponse— 公开 HTTP 错误响应详细信息的合约,包括 HTTP状态、响应标头和 RFC 9457 格式的正文;这允许异常封装并公开它们如何映射到 HTTP 响应的详细信息。所有 Spring MVC异常都实现了这一点。 -
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异常,其中包括所有内置的 Web 异常。您可以添加更多异常处理方法,并且使用受保护的方法将任何异常映射到ProblemDetail.
非标准字段
您可以通过以下两种方式之一扩展具有非标准字段的 RFC 9457 响应。
一、插入“属性”Map之ProblemDetail. 使用 Jackson库时,Spring Framework 注册ProblemDetailJacksonMixin确保这一点“属性”Map在response 中解包并呈现为顶级 JSON 属性,同样,反序列化期间的任何未知属性都会插入到 这Map.
您还可以扩展ProblemDetail以添加专用的非标准属性。中的复制构造函数ProblemDetail允许子类使其易于创建从现有的ProblemDetail. 这可以集中完成,例如从@ControllerAdvice如ResponseEntityExceptionHandler重新创建ProblemDetail将异常转换为具有附加非标准字段的子类。
定制和 i18n
自定义错误响应详细信息并使其国际化是一个常见的要求。自定义 Spring MVC 异常的问题详细信息也是一种很好的做法以避免泄露实现细节。本节描述了对此的支持。
一ErrorResponse公开“type”、“title”和“detail”的消息代码,以及
“detail”字段的消息代码参数。ResponseEntityExceptionHandler解决
这些通过 MessageSource 并更新相应的ProblemDetail相应地字段。
消息代码的默认策略如下所示:
-
“类型”:
problemDetail.type.[fully qualified exception class name] -
“标题”:
problemDetail.title.[fully qualified exception class name] -
“细节”:
problemDetail.[fully qualified exception class name][suffix]
一ErrorResponse可能会公开多个消息代码,通常添加后缀
到默认消息代码。下表列出了消息代码和参数
Spring MVC 异常:
| 例外 | 消息代码 | 消息代码参数 |
|---|---|---|
|
(默认) |
|
|
(默认) |
|
|
(默认) |
|
|
(默认) |
|
|
(默认)+ “.parseError” |
|
|
(默认) |
|
|
(默认)+ “.parseError” |
|
|
(默认) |
|
|
(默认) |
|
|
(默认) |
|
|
(默认) |
|
|
(默认) |
|
|
(默认) |
|
|
(默认) |
|
|
(默认) |
|
|
(默认) |
|
|
(默认) |
|
|
(默认) |
|
|
(默认) |
|
|
(默认) |
|
|
(默认) |
|
与其他异常不同,消息参数MethodArgumentValidException和HandlerMethodValidationException被列入名单MessageSourceResolvable错误,也可以通过 MessageSource 资源包进行自定义。有关更多详细信息,请参阅自定义验证错误。 |
客户处理
客户端应用程序可以捕获WebClientResponseException,当使用WebClient,
或RestClientResponseException使用RestTemplate,并使用它们的getResponseBodyAs将错误响应正文解码为任何目标类型的方法,例如ProblemDetail,或ProblemDetail.