对于最新的稳定版本,请使用 Spring Framework 6.2.0spring-doc.cadn.net.cn

错误响应

REST 服务的常见要求是在错误正文中包含详细信息 反应。Spring Framework 支持“HTTP API 的问题详细信息” 规范,RFC 7807spring-doc.cadn.net.cn

以下是此支持的主要抽象:spring-doc.cadn.net.cn

  • ProblemDetail— RFC 7807 问题详细信息的表示形式;一个简单的容器 对于规范中定义的标准字段和非标准字段。spring-doc.cadn.net.cn

  • ErrorResponse— 用于公开 HTTP 错误响应详细信息(包括 HTTP)的合约 status、响应标头和 RFC 7807 格式的正文;这允许 封装并公开它们如何映射到 HTTP 响应的详细信息。所有 Spring WebFlux exceptions 实现此目的。spring-doc.cadn.net.cn

  • ErrorResponseException— 基本ErrorResponse其他人的实现 可以用作方便的基类。spring-doc.cadn.net.cn

  • ResponseEntityExceptionHandler— 处理所有 Spring WebFlux 异常的 @ControllerAdvice 的便捷基类, 和任何ErrorResponseException,并呈现带有正文的错误响应。spring-doc.cadn.net.cn

呈现

您可以返回ProblemDetailErrorResponse从任何@ExceptionHandler或从 任何@RequestMapping方法来呈现 RFC 7807 响应。其处理方式如下:spring-doc.cadn.net.cn

  • status的属性ProblemDetail确定 HTTP 状态。spring-doc.cadn.net.cn

  • instance的属性ProblemDetail从当前 URL 路径设置(如果不是 已经设置好了。spring-doc.cadn.net.cn

  • 对于内容协商,JacksonHttpMessageConverter喜欢 “application/problem+json”而不是“application/json”ProblemDetail, 如果未找到兼容的媒体类型,则还会回退到它。spring-doc.cadn.net.cn

要为 Spring WebFlux 异常和任何ErrorResponseException扩展ResponseEntityExceptionHandler并将其声明为 Spring 配置中的 @ControllerAdvice。处理程序 具有@ExceptionHandler处理任何ErrorResponseexception 的 包括所有内置的 Web 例外。您可以添加更多异常处理方法,并且 使用 protected 方法将任何异常映射到ProblemDetail.spring-doc.cadn.net.cn

非标准字段

您可以通过以下两种方式之一扩展包含非标准字段的 RFC 7807 响应。spring-doc.cadn.net.cn

一、插入到“properties”MapProblemDetail.使用 Jackson 时 library 中,Spring Framework 寄存器ProblemDetailJacksonMixin这确保了 “属性”Map被解包并呈现为 response,同样,反序列化期间的任何未知属性都会入到 这Map.spring-doc.cadn.net.cn

您还可以扩展ProblemDetail以添加专用的非标准属性。 中的 copy 构造函数ProblemDetail允许子类使其易于创建 从现有的ProblemDetail.这可以集中完成,例如从@ControllerAdviceResponseEntityExceptionHandler这会重新创建ProblemDetail的异常转换为具有其他非标准字段的子类。spring-doc.cadn.net.cn

国际化

将错误响应详细信息国际化是一个常见的要求,并且是良好的实践 自定义 Spring WebFlux 异常的问题详细信息。支持如下:spring-doc.cadn.net.cn

  • ErrorResponse公开消息代码和参数以解析 “detail” 字段 通过 MessageSource。 实际的消息代码值使用占位符进行参数化,例如"HTTP method {0} not supported"以从参数中扩展。spring-doc.cadn.net.cn

  • ErrorResponse此外,还公开了 Message 代码以解析 “title” 字段。spring-doc.cadn.net.cn

  • ResponseEntityExceptionHandler使用消息代码和参数解析 “detail” 和 “title” 字段。spring-doc.cadn.net.cn

默认情况下,“detail”字段的消息代码为 “problemDetail”。+ 完全 限定的异常类名称。某些异常可能会在 在这种情况下,后缀将添加到默认消息代码中。下表列出了消息 Spring WebFlux 异常的参数和代码:spring-doc.cadn.net.cn

例外 消息代码 消息代码参数

UnsupportedMediaTypeStatusExceptionspring-doc.cadn.net.cn

(默认)spring-doc.cadn.net.cn

{0}不支持的媒体类型,{1}支持的媒体类型列表spring-doc.cadn.net.cn

UnsupportedMediaTypeStatusExceptionspring-doc.cadn.net.cn

(默认) + “.parseError”spring-doc.cadn.net.cn

MissingRequestValueExceptionspring-doc.cadn.net.cn

(默认)spring-doc.cadn.net.cn

{0}值的标签(例如 “Request header”、“Cookie Value”等),{1}值名称spring-doc.cadn.net.cn

UnsatisfiedRequestParameterExceptionspring-doc.cadn.net.cn

(默认)spring-doc.cadn.net.cn

{0}参数条件列表spring-doc.cadn.net.cn

WebExchangeBindExceptionspring-doc.cadn.net.cn

(默认)spring-doc.cadn.net.cn

{0}全局错误列表,{1}字段错误列表。 每个错误的消息代码和参数BindingResult也已解决 通过MessageSource.spring-doc.cadn.net.cn

NotAcceptableStatusExceptionspring-doc.cadn.net.cn

(默认)spring-doc.cadn.net.cn

{0}支持的媒体类型列表spring-doc.cadn.net.cn

NotAcceptableStatusExceptionspring-doc.cadn.net.cn

(默认) + “.parseError”spring-doc.cadn.net.cn

ServerErrorExceptionspring-doc.cadn.net.cn

(默认)spring-doc.cadn.net.cn

{0}提供给类构造函数的失败原因spring-doc.cadn.net.cn

MethodNotAllowedExceptionspring-doc.cadn.net.cn

(默认)spring-doc.cadn.net.cn

{0}当前的 HTTP 方法{1}支持的 HTTP 方法列表spring-doc.cadn.net.cn

默认情况下,“title”字段的消息代码为 “problemDetail.title.” + 完全 限定的异常类名称。spring-doc.cadn.net.cn

客户处理

客户端应用程序可以捕获WebClientResponseException,当使用WebClient, 或RestClientResponseException使用RestTemplate,并使用其getResponseBodyAs方法将错误响应正文解码为任何目标类型,例如ProblemDetailProblemDetail.spring-doc.cadn.net.cn