此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Framework 6.1.10Spring中文文档

此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Framework 6.1.10Spring中文文档

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

以下是此支持的主要抽象:Spring中文文档

  • ProblemDetail— RFC 9457 问题详细信息的表示;一个简单的容器 对于规范中定义的标准字段和非标准字段。Spring中文文档

  • ErrorResponse— 公开 HTTP 错误响应详细信息(包括 HTTP)的合约 状态、响应标头和 RFC 9457 格式的正文;这允许例外 封装并公开它们如何映射到 HTTP 响应的详细信息。所有 Spring MVC 例外实现这一点。Spring中文文档

  • ErrorResponseException— 其他人的基本实现 可以用作方便的基类。ErrorResponseSpring中文文档

  • ResponseEntityExceptionHandler— 方便的基类,用于处理所有 Spring MVC 异常的@ControllerAdvice, 和 any ,并使用 body 呈现错误响应。ErrorResponseExceptionSpring中文文档

呈现

您可以返回或从任何或从 呈现 RFC 9457 响应的任何方法。其处理方式如下:ProblemDetailErrorResponse@ExceptionHandler@RequestMappingSpring中文文档

  • 的属性确定 HTTP 状态。statusProblemDetailSpring中文文档

  • 的属性是从当前 URL 路径设置的,如果不是 已经设置好了。instanceProblemDetailSpring中文文档

  • 对于内容协商,杰克逊更喜欢 “application/problem+json”在“application/json”上呈现 , 如果没有找到兼容的媒体类型,也可以回退到它。HttpMessageConverterProblemDetailSpring中文文档

要为 Spring WebFlux 异常和任何 启用 RFC 9457 响应,请在 Spring 配置中扩展并声明为@ControllerAdvice。处理程序 有一个处理任何异常的方法,它 包括所有内置的 Web 例外。您可以添加更多异常处理方法,以及 使用受保护的方法将任何异常映射到 .ErrorResponseExceptionResponseEntityExceptionHandler@ExceptionHandlerErrorResponseProblemDetailSpring中文文档

您可以通过 MVC Config 使用 .用它来拦截 任何 RFC 7807 响应并采取一些措施。ErrorResponseWebMvcConfigurerSpring中文文档

非标准字段

您可以通过以下两种方式之一使用非标准字段扩展 RFC 9457 响应。Spring中文文档

一、插入到的“属性”中。使用杰克逊时 库,Spring Framework 寄存器可以确保这一点 “properties”被解包并呈现为顶级 JSON 属性 响应,同样,反序列化期间的任何未知属性都会插入到 这。MapProblemDetailProblemDetailJacksonMixinMapMapSpring中文文档

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

定制和 i18n

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

An 公开了 “type”、“title” 和 “detail” 的消息代码,以及 “detail”字段的消息代码参数。 解决 这些通过 MessageSource 并相应地更新相应的字段。ErrorResponseResponseEntityExceptionHandlerProblemDetailSpring中文文档

消息代码的默认策略如下:Spring中文文档

  • “类型”:problemDetail.type.[fully qualified exception class name]Spring中文文档

  • “标题”:problemDetail.title.[fully qualified exception class name]Spring中文文档

  • “详细”:problemDetail.[fully qualified exception class name][suffix]Spring中文文档

可以公开多个消息代码,通常添加后缀 更改为默认消息代码。下表列出了消息代码和参数 Spring MVC 异常:ErrorResponseSpring中文文档

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

AsyncRequestTimeoutExceptionSpring中文文档

(默认)Spring中文文档

ConversionNotSupportedExceptionSpring中文文档

(默认)Spring中文文档

{0}属性名称、属性值{1}Spring中文文档

HandlerMethodValidationExceptionSpring中文文档

(默认)Spring中文文档

{0}列出所有验证错误。 每个错误的消息代码和参数也通过 解析。MessageSourceSpring中文文档

HttpMediaTypeNotAcceptableExceptionSpring中文文档

(默认)Spring中文文档

{0}支持的媒体类型列表Spring中文文档

HttpMediaTypeNotAcceptableExceptionSpring中文文档

(默认值) + “.parseError”Spring中文文档

HttpMediaTypeNotSupportedExceptionSpring中文文档

(默认)Spring中文文档

{0}不支持的媒体类型,支持的媒体类型列表{1}Spring中文文档

HttpMediaTypeNotSupportedExceptionSpring中文文档

(默认值) + “.parseError”Spring中文文档

HttpMessageNotReadableExceptionSpring中文文档

(默认)Spring中文文档

HttpMessageNotWritableExceptionSpring中文文档

(默认)Spring中文文档

HttpRequestMethodNotSupportedExceptionSpring中文文档

(默认)Spring中文文档

{0}当前 HTTP 方法,支持的 HTTP 方法列表{1}Spring中文文档

MethodArgumentNotValidExceptionSpring中文文档

(默认)Spring中文文档

{0}全局错误列表,字段错误列表。 每个错误的消息代码和参数也通过 解析。{1}MessageSourceSpring中文文档

MissingRequestHeaderExceptionSpring中文文档

(默认)Spring中文文档

{0}标头名称Spring中文文档

MissingServletRequestParameterExceptionSpring中文文档

(默认)Spring中文文档

{0}请求参数名称Spring中文文档

MissingMatrixVariableExceptionSpring中文文档

(默认)Spring中文文档

{0}矩阵变量名称Spring中文文档

MissingPathVariableExceptionSpring中文文档

(默认)Spring中文文档

{0}路径变量名称Spring中文文档

MissingRequestCookieExceptionSpring中文文档

(默认)Spring中文文档

{0}Cookie 名称Spring中文文档

MissingServletRequestPartExceptionSpring中文文档

(默认)Spring中文文档

{0}部件名称Spring中文文档

NoHandlerFoundExceptionSpring中文文档

(默认)Spring中文文档

NoResourceFoundExceptionSpring中文文档

(默认)Spring中文文档

TypeMismatchExceptionSpring中文文档

(默认)Spring中文文档

{0}属性名称、属性值{1}Spring中文文档

UnsatisfiedServletRequestParameterExceptionSpring中文文档

(默认)Spring中文文档

{0}参数条件列表Spring中文文档

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

AsyncRequestTimeoutExceptionSpring中文文档

(默认)Spring中文文档

ConversionNotSupportedExceptionSpring中文文档

(默认)Spring中文文档

{0}属性名称、属性值{1}Spring中文文档

HandlerMethodValidationExceptionSpring中文文档

(默认)Spring中文文档

{0}列出所有验证错误。 每个错误的消息代码和参数也通过 解析。MessageSourceSpring中文文档

HttpMediaTypeNotAcceptableExceptionSpring中文文档

(默认)Spring中文文档

{0}支持的媒体类型列表Spring中文文档

HttpMediaTypeNotAcceptableExceptionSpring中文文档

(默认值) + “.parseError”Spring中文文档

HttpMediaTypeNotSupportedExceptionSpring中文文档

(默认)Spring中文文档

{0}不支持的媒体类型,支持的媒体类型列表{1}Spring中文文档

HttpMediaTypeNotSupportedExceptionSpring中文文档

(默认值) + “.parseError”Spring中文文档

HttpMessageNotReadableExceptionSpring中文文档

(默认)Spring中文文档

HttpMessageNotWritableExceptionSpring中文文档

(默认)Spring中文文档

HttpRequestMethodNotSupportedExceptionSpring中文文档

(默认)Spring中文文档

{0}当前 HTTP 方法,支持的 HTTP 方法列表{1}Spring中文文档

MethodArgumentNotValidExceptionSpring中文文档

(默认)Spring中文文档

{0}全局错误列表,字段错误列表。 每个错误的消息代码和参数也通过 解析。{1}MessageSourceSpring中文文档

MissingRequestHeaderExceptionSpring中文文档

(默认)Spring中文文档

{0}标头名称Spring中文文档

MissingServletRequestParameterExceptionSpring中文文档

(默认)Spring中文文档

{0}请求参数名称Spring中文文档

MissingMatrixVariableExceptionSpring中文文档

(默认)Spring中文文档

{0}矩阵变量名称Spring中文文档

MissingPathVariableExceptionSpring中文文档

(默认)Spring中文文档

{0}路径变量名称Spring中文文档

MissingRequestCookieExceptionSpring中文文档

(默认)Spring中文文档

{0}Cookie 名称Spring中文文档

MissingServletRequestPartExceptionSpring中文文档

(默认)Spring中文文档

{0}部件名称Spring中文文档

NoHandlerFoundExceptionSpring中文文档

(默认)Spring中文文档

NoResourceFoundExceptionSpring中文文档

(默认)Spring中文文档

TypeMismatchExceptionSpring中文文档

(默认)Spring中文文档

{0}属性名称、属性值{1}Spring中文文档

UnsatisfiedServletRequestParameterExceptionSpring中文文档

(默认)Spring中文文档

{0}参数条件列表Spring中文文档

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

客户端处理

客户端应用程序可以捕获 ,当使用 , 或者当使用 时,并使用他们的方法将错误响应正文解码为任何目标类型,例如 ,或 的子类。WebClientResponseExceptionWebClientRestClientResponseExceptionRestTemplategetResponseBodyAsProblemDetailProblemDetailSpring中文文档