此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Framework 6.2.10spring-doc.cadn.net.cn

错误响应

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

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

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

  • ErrorResponse— 公开 HTTP 错误响应详细信息(包括 HTTP 的合约) 状态、响应标头和 RFC 9457 格式的正文;这允许例外 封装并公开它们如何映射到 HTTP 响应的详细信息。全弹簧 MVC 异常实现了这一点。spring-doc.cadn.net.cn

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

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

呈现

您可以返回ProblemDetailErrorResponse从任何@ExceptionHandler或从 任何@RequestMapping呈现 RFC 9457 响应的方法。这是按如下方式处理的: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 MVC 异常和任何ErrorResponseException扩展ResponseEntityExceptionHandler并在 Spring 配置中将其声明为 @ControllerAdvice。处理程序 有一个@ExceptionHandler处理任何ErrorResponseexception,其中 包括所有内置的 Web 异常。您可以添加更多异常处理方法,并且 使用受保护的方法将任何异常映射到ProblemDetail.spring-doc.cadn.net.cn

您可以注册ErrorResponse拦截器通过 MVC 配置,使用WebMvcConfigurer.用它来拦截 任何 RFC 9457 响应并采取一些措施。spring-doc.cadn.net.cn

非标准字段

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

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

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

定制和 i18n

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

ErrorResponse公开“type”、“title”和“detail”的消息代码,以及 “detail”字段的消息代码参数。ResponseEntityExceptionHandler解决 这些通过 MessageSource 并更新相应的ProblemDetail相应地字段。spring-doc.cadn.net.cn

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

ErrorResponse可能会公开多个消息代码,通常添加后缀 到默认消息代码。下表列出了消息代码和参数 Spring MVC 异常:spring-doc.cadn.net.cn

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

AsyncRequestTimeoutExceptionspring-doc.cadn.net.cn

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

ConversionNotSupportedExceptionspring-doc.cadn.net.cn

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

{0}属性名称,{1}属性值spring-doc.cadn.net.cn

HandlerMethodValidationExceptionspring-doc.cadn.net.cn

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

{0}列出所有验证错误。 每个错误的消息代码和参数也通过以下方式解析MessageSource.spring-doc.cadn.net.cn

HttpMediaTypeNotAcceptableExceptionspring-doc.cadn.net.cn

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

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

HttpMediaTypeNotAcceptableExceptionspring-doc.cadn.net.cn

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

HttpMediaTypeNotSupportedExceptionspring-doc.cadn.net.cn

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

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

HttpMediaTypeNotSupportedExceptionspring-doc.cadn.net.cn

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

HttpMessageNotReadableExceptionspring-doc.cadn.net.cn

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

HttpMessageNotWritableExceptionspring-doc.cadn.net.cn

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

HttpRequestMethodNotSupportedExceptionspring-doc.cadn.net.cn

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

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

MethodArgumentNotValidExceptionspring-doc.cadn.net.cn

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

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

MissingRequestHeaderExceptionspring-doc.cadn.net.cn

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

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

MissingServletRequestParameterExceptionspring-doc.cadn.net.cn

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

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

MissingMatrixVariableExceptionspring-doc.cadn.net.cn

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

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

MissingPathVariableExceptionspring-doc.cadn.net.cn

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

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

MissingRequestCookieExceptionspring-doc.cadn.net.cn

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

{0}Cookie 名称spring-doc.cadn.net.cn

MissingServletRequestPartExceptionspring-doc.cadn.net.cn

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

{0}部件名称spring-doc.cadn.net.cn

NoHandlerFoundExceptionspring-doc.cadn.net.cn

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

NoResourceFoundExceptionspring-doc.cadn.net.cn

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

TypeMismatchExceptionspring-doc.cadn.net.cn

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

{0}属性名称,{1}属性值spring-doc.cadn.net.cn

UnsatisfiedServletRequestParameterExceptionspring-doc.cadn.net.cn

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

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

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

客户处理

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