春季休息 - 例外处理 - 问题细节
#java #springboot #开发人员 #exceptionhandling

概述

在上一部分中(链接到读取文章here),解释了如何以特定的JSON格式为客户REST应用程序创建自定义错误消息。这是需要的,因为大多数时候,HTTP状态对客户的信息不足。因此,必须将详细信息发送给客户有关该问题的信息。
为了实现这一目标,我们必须创建自己的班级RestRorresponse。这是REST应用程序在错误响应正文中提供详细信息的普遍要求。在这里,HTTP API规范的问题详细信息(代码RFC 7807)派上用场。它的目的是在HTTP响应中定义常见的错误格式,以便应用不必定义自己的误差格式。它也可以扩展,正如我们在本文稍后将看到的那样。

RFC 7807的春季支持

在Spring 6和Springboot 3中添加了对该规范的支持。让我们快速回顾一下主要的摘要:

  1. Quarderdetail:代表RFC 7807的问题细节的主类。它包含提供问题信息(例如SETETITLE,SETDETAILS和SETTYPE)的方法(Thess是规格定义的属性)。它还具有用于其他非标准属性的属性图。

  2. errorresponse:此界面代表一个完整的错误响应,包括状态,标题和QuardsDetail作为主体。所有Spring MVC异常实施,意思是

  3. 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
}

规格定义的属性是:

  1. 类型:用于将客户指向文档,清楚地解释发生了什么以及为什么。
  2. 标题:问题的简短标题。
  3. 状态:HTTP状态代码。
  4. 细节:问题的描述。
  5. 实例:遇到问题的终点。

这不是全部,响应中返回的内容类型标头表明存在问题。这种新媒体类型也是规格的一部分。

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错误页面。

Image description

仅将以下行添加到应用程序。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格式的自定义属性。

今天都是堡垒。施加如果您觉得此内容有用,因为新文章将在临时几周内发表。