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

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

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

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

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

  • ResponseEntityExceptionHandler— 处理所有 Spring MVC 异常的 @ControllerAdvice 的便捷基类, 和 any ,并呈现带有正文的错误响应。ErrorResponseExceptionspring-doc.cn

呈现

您可以从任何 或 from 返回 或从 any 方法呈现 RFC 9457 响应。其处理方式如下:ProblemDetailErrorResponse@ExceptionHandler@RequestMappingspring-doc.cn

  • 的属性确定 HTTP 状态。statusProblemDetailspring-doc.cn

  • 的 属性是从当前 URL 路径设置的,如果没有 已经设置好了。instanceProblemDetailspring-doc.cn

  • 对于内容协商,Jackson 更喜欢 “application/problem+json”而不是“application/json”,当渲染 如果未找到兼容的媒体类型,则还会回退到它。HttpMessageConverterProblemDetailspring-doc.cn

要为 Spring WebFlux 异常和 any 启用 RFC 9457 响应,请扩展并将其声明为 Spring 配置中的 @ControllerAdvice。处理程序 具有处理任何异常的方法,该方法 包括所有内置的 Web 例外。您可以添加更多异常处理方法,并且 使用 protected 方法将任何异常映射到 .ErrorResponseExceptionResponseEntityExceptionHandler@ExceptionHandlerErrorResponseProblemDetailspring-doc.cn

非标准字段

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

第一,插入 的 “属性” 中。使用 Jackson 时 库,Spring Framework 寄存器确保 “properties” 被解包并呈现为 response,同样,反序列化期间的任何未知属性都会入到 这。MapProblemDetailProblemDetailJacksonMixinMapMapspring-doc.cn

您还可以扩展以添加专用的非标准属性。 中的 copy 构造函数允许子类易于创建 从现有的 .这可以集中完成,例如,从这样一个将异常重新创建到具有附加非标准字段的子类中。ProblemDetailProblemDetailProblemDetail@ControllerAdviceResponseEntityExceptionHandlerProblemDetailspring-doc.cn

定制和 i18n

自定义和国际化错误响应详细信息是一个常见的要求。 自定义 Spring MVC 异常的问题详细信息也是一种很好的做法 以避免泄露实现细节。本节介绍对此的支持。spring-doc.cn

An 公开了 “type”、“title” 和 “detail” 的消息代码,以及 “detail” 字段的消息代码参数。 解决 这些字段,并相应地更新相应的字段。ErrorResponseResponseEntityExceptionHandlerProblemDetailspring-doc.cn

消息代码的默认策略如下:spring-doc.cn

  • “type”:problemDetail.type.[fully qualified exception class name]spring-doc.cn

  • “title”:problemDetail.title.[fully qualified exception class name]spring-doc.cn

  • “detail”:problemDetail.[fully qualified exception class name][suffix]spring-doc.cn

可以公开多个消息代码,通常会添加后缀 设置为默认消息代码。下表列出了 Spring MVC 异常:ErrorResponsespring-doc.cn

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

AsyncRequestTimeoutExceptionspring-doc.cn

(默认)spring-doc.cn

ConversionNotSupportedExceptionspring-doc.cn

(默认)spring-doc.cn

{0}属性名称、属性值{1}spring-doc.cn

HandlerMethodValidationExceptionspring-doc.cn

(默认)spring-doc.cn

{0}列出所有验证错误。 每个错误的消息代码和参数也通过 解决。MessageSourcespring-doc.cn

HttpMediaTypeNotAcceptableExceptionspring-doc.cn

(默认)spring-doc.cn

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

HttpMediaTypeNotAcceptableExceptionspring-doc.cn

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

HttpMediaTypeNotSupportedExceptionspring-doc.cn

(默认)spring-doc.cn

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

HttpMediaTypeNotSupportedExceptionspring-doc.cn

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

HttpMessageNotReadableExceptionspring-doc.cn

(默认)spring-doc.cn

HttpMessageNotWritableExceptionspring-doc.cn

(默认)spring-doc.cn

HttpRequestMethodNotSupportedExceptionspring-doc.cn

(默认)spring-doc.cn

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

MethodArgumentNotValidExceptionspring-doc.cn

(默认)spring-doc.cn

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

MissingRequestHeaderExceptionspring-doc.cn

(默认)spring-doc.cn

{0}标头名称spring-doc.cn

MissingServletRequestParameterExceptionspring-doc.cn

(默认)spring-doc.cn

{0}请求参数名称spring-doc.cn

MissingMatrixVariableExceptionspring-doc.cn

(默认)spring-doc.cn

{0}矩阵变量名称spring-doc.cn

MissingPathVariableExceptionspring-doc.cn

(默认)spring-doc.cn

{0}路径变量名称spring-doc.cn

MissingRequestCookieExceptionspring-doc.cn

(默认)spring-doc.cn

{0}Cookie 名称spring-doc.cn

MissingServletRequestPartExceptionspring-doc.cn

(默认)spring-doc.cn

{0}零件名称spring-doc.cn

NoHandlerFoundExceptionspring-doc.cn

(默认)spring-doc.cn

NoResourceFoundExceptionspring-doc.cn

(默认)spring-doc.cn

TypeMismatchExceptionspring-doc.cn

(默认)spring-doc.cn

{0}属性名称、属性值{1}spring-doc.cn

UnsatisfiedServletRequestParameterExceptionspring-doc.cn

(默认)spring-doc.cn

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

与其他异常不同,和 的消息参数基于错误列表,这些错误列表也可以通过 MessageSource 资源包进行自定义。有关更多详细信息,请参阅 自定义验证错误MethodArgumentValidExceptionHandlerMethodValidationExceptionMessageSourceResolvable
例外 消息代码 消息代码参数

AsyncRequestTimeoutExceptionspring-doc.cn

(默认)spring-doc.cn

ConversionNotSupportedExceptionspring-doc.cn

(默认)spring-doc.cn

{0}属性名称、属性值{1}spring-doc.cn

HandlerMethodValidationExceptionspring-doc.cn

(默认)spring-doc.cn

{0}列出所有验证错误。 每个错误的消息代码和参数也通过 解决。MessageSourcespring-doc.cn

HttpMediaTypeNotAcceptableExceptionspring-doc.cn

(默认)spring-doc.cn

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

HttpMediaTypeNotAcceptableExceptionspring-doc.cn

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

HttpMediaTypeNotSupportedExceptionspring-doc.cn

(默认)spring-doc.cn

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

HttpMediaTypeNotSupportedExceptionspring-doc.cn

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

HttpMessageNotReadableExceptionspring-doc.cn

(默认)spring-doc.cn

HttpMessageNotWritableExceptionspring-doc.cn

(默认)spring-doc.cn

HttpRequestMethodNotSupportedExceptionspring-doc.cn

(默认)spring-doc.cn

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

MethodArgumentNotValidExceptionspring-doc.cn

(默认)spring-doc.cn

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

MissingRequestHeaderExceptionspring-doc.cn

(默认)spring-doc.cn

{0}标头名称spring-doc.cn

MissingServletRequestParameterExceptionspring-doc.cn

(默认)spring-doc.cn

{0}请求参数名称spring-doc.cn

MissingMatrixVariableExceptionspring-doc.cn

(默认)spring-doc.cn

{0}矩阵变量名称spring-doc.cn

MissingPathVariableExceptionspring-doc.cn

(默认)spring-doc.cn

{0}路径变量名称spring-doc.cn

MissingRequestCookieExceptionspring-doc.cn

(默认)spring-doc.cn

{0}Cookie 名称spring-doc.cn

MissingServletRequestPartExceptionspring-doc.cn

(默认)spring-doc.cn

{0}零件名称spring-doc.cn

NoHandlerFoundExceptionspring-doc.cn

(默认)spring-doc.cn

NoResourceFoundExceptionspring-doc.cn

(默认)spring-doc.cn

TypeMismatchExceptionspring-doc.cn

(默认)spring-doc.cn

{0}属性名称、属性值{1}spring-doc.cn

UnsatisfiedServletRequestParameterExceptionspring-doc.cn

(默认)spring-doc.cn

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

与其他异常不同,和 的消息参数基于错误列表,这些错误列表也可以通过 MessageSource 资源包进行自定义。有关更多详细信息,请参阅 自定义验证错误MethodArgumentValidExceptionHandlerMethodValidationExceptionMessageSourceResolvable

客户处理

客户端应用程序可以在使用 、 或者使用 时,并使用其方法将错误响应正文解码为任何目标类型,例如 或 .WebClientResponseExceptionWebClientRestClientResponseExceptionRestTemplategetResponseBodyAsProblemDetailProblemDetailspring-doc.cn