概述
在上一部分中(链接到读取文章here),解释了如何以特定的JSON格式为客户REST应用程序创建自定义错误消息。这是需要的,因为大多数时候,HTTP状态对客户的信息不足。因此,必须将详细信息发送给客户有关该问题的信息。
为了实现这一目标,我们必须创建自己的班级RestRorresponse。这是REST应用程序在错误响应正文中提供详细信息的普遍要求。在这里,HTTP API规范的问题详细信息(代码RFC 7807)派上用场。它的目的是在HTTP响应中定义常见的错误格式,以便应用不必定义自己的误差格式。它也可以扩展,正如我们在本文稍后将看到的那样。
RFC 7807的春季支持
在Spring 6和Springboot 3中添加了对该规范的支持。让我们快速回顾一下主要的摘要:
-
Quarderdetail:代表RFC 7807的问题细节的主类。它包含提供问题信息(例如SETETITLE,SETDETAILS和SETTYPE)的方法(Thess是规格定义的属性)。它还具有用于其他非标准属性的属性图。
-
errorresponse:此界面代表一个完整的错误响应,包括状态,标题和QuardsDetail作为主体。所有Spring MVC异常实施,意思是
-
errorResponseException:对于其他例外,errorresponse和ControrSient类的默认实现。它也可以用于减少某些应用程序的自定义异常数量。
没有任何其他ADO,让我们编码一些示例
问题尾行在行动中
我们将从这些系列的第1部分中更新代码。让我们回顾一下它的工作方式:
-
当找不到客户时,控制器会引发异常。
-
然后,全局建议处理并返回我们的自定义错误类。
让我们对代码进行一些更改。首先,例外将使客户ID保持在一个字段中。
public class CustomerNotFoundException extends RuntimeException {
private Long id;
public CustomerNotFoundException(Long id) {
super("Customer "+id+" not found!");
this.id = id;
}
public Long getId() {
return id;
}
}
然后,管理该方法的例外方法将如下更新。
@ExceptionHandler(CustomerNotFoundException.class) ProblemDetail
handleCustomerNotFoundException(CustomerNotFoundException ex) {
ProblemDetail problemDetails = ProblemDetail
.forStatusAndDetail
(HttpStatus.NOT_FOUND,ex.getLocalizedMessage());
problemDetails.setType(URI.create(
"http://localhost:8080/errors/customer-not-found"));
problemDetails.setTitle("Customer Not Found");
// Adding non-standard property
problemDetails.setProperty("customerId", ex.getId());
return problemDetails;
}
请注意,QuardsDetail和ErrorResponse均以@ExceptionHandler方法直接呈现为响应的返回值(例如,通过标记@ResponseBody,或在@RestController或RestControllerAdvice类中声明)。
)。)。致电url http://localhost:8080/api/v1/customers/1000获取不存在的客户将返回以下数据:
{
"type": "http://localhost:8080/errors/customer-not-found",
"title": "Customer Not Found",
"status": 404,
"detail": "Customer 1000 not found!",
"instance": "/api/v1/customers/1000",
"customerId": 1000
}
规格定义的属性是:
- 类型:用于将客户指向文档,清楚地解释发生了什么以及为什么。
- 标题:问题的简短标题。
- 状态:HTTP状态代码。
- 细节:问题的描述。
- 实例:遇到问题的终点。
这不是全部,响应中返回的内容类型标头表明存在问题。这种新媒体类型也是规格的一部分。
Content-Type: application/problem+json
加上一个名为“ customerId”的非标准属性作为属性的元素。 Spring Boot使用Jackson库,属性映射会自动转换为JSON(通过问题Detailjacksonmixin呈现为顶级JSON属性)。
自动配置问题拖网
QuarderDetails可以在Spring MVC中自动配置,以使用应用程序/问题+JSON媒体类型产生自定义错误消息。可以通过设置属性spring.mvc.problemdetails.shabled.
来启用此支持。这意味着启用此功能(即使没有配置的ControllerAdvice或ExceptionHandlers),响应将为RFC 7807。
例如,假设我们的@RestControllerAdvice从项目中删除。也就是说,我们的REST应用不会直接管理异常。现在尝试达到端点
http://localhost:8080/api/v1/customers/sssss
这将抛出一种方法,因为方法参数不是预期的类型,因为方法参数不是预期的类型。由于没有宣布此处理程序(或任何其他父母例外)对客户的响应将是:
{
"timestamp": "2023-04-29T23:51:50.291+00:00",
"status": 400,
"error": "Bad Request",
"path": "/api/v1/customers/11"
}
使用浏览器弹簧访问时将重新调整Whitelabel错误页面。
仅将以下行添加到应用程序。Properties文件
spring.mvc.problemdetails.enabled=true
将激活问题的避难所错误响应,从而产生以下JSON
{
"type": "about:blank",
"title": "Bad Request",
"status": 400,
"detail": "Failed to convert 'customerId' with value: 'asasa'",
"instance": "/api/v1/customers/asasa"
}
所有这些都添加了一个配置行!
结论
这个简单的规格在春季框架中很容易使用。我们可以对应用程序标记错误响应。可以扩展以添加附加在JSON格式的自定义属性。
今天都是堡垒。施加如果您觉得此内容有用,因为新文章将在临时几周内发表。