当前位置: 首页 > 知识库问答 >
问题:

Spring boot API自定义错误响应协定

苏志
2023-03-14
{
  "success": true,
  "data": {"name": "hello", "completed": false},
  "errors": []
}
{
"timestamp": "2019-11-21T15:41:28.545+0000",
"status": 400,
"error": "Bad Request",
"errors": [
    {
        "codes": [
            "Size.createTodoContract.name",
            "Size.name",
            "Size.java.lang.String",
            "Size"
        ],
        "arguments": [
            {
                "codes": [
                    "createTodoContract.name",
                    "name"
                ],
                "arguments": null,
                "defaultMessage": "name",
                "code": "name"
            },
            10,
            2
        ],
        "defaultMessage": "size must be between 2 and 10",
        "objectName": "createTodoContract",
        "field": "name",
        "rejectedValue": "attend wedding",
        "bindingFailure": false,
        "code": "Size"
    }
],
"message": "Validation failed for object='createTodoContract'. Error count: 1",
"path": "/api/todos"
}
@Getter
public class CreateTodoContract {
  @Size(min = 2, max = 10)
  private String name;

  @NotNull
  private boolean completed;
}

请帮助我了解我应该在哪里更新失败案例的实际合同?

共有1个答案

西门安宁
2023-03-14

你把项目中的一些编码部分搞乱了。

1)首先,为所有@size注释和所有其他与验证相关的注释(@notnull、@notempty等)添加“message”属性。当您尝试发出失败请求时,API将返回您在“message”属性中提到的错误消息。请参见下面的代码行。这些注释使用javax.validation.constraints库。其他注释也可以。但这样更好。

@Size(min = 1, message = "email can not be empty")
@NotNull(message = "email can not be null")
private String email;

2)然后,您应该通过使用“bindingresult”类(org.springframework.validation)在controller(API定义)中捕获这些无效场景,如下所示。此外,您还应该为您的请求体(CreateTodoContract)使用@valid annotaion;否则,服务器将重新调整您在问题中提到的无效场景的响应。

@PostMapping(value = "createTodoContract")
public ResponseEntity<Object> CreateTodoContract(@Valid @RequestBody 
                                                 CreateTodoContract 
                                                 createTodoContractRequest,
                                                 BindingResult bindingResult) {
    if (bindingResult.hasErrors()) {
        String error = bindingResult.getAllErrors().get(0).getDefaultMessage();
        return new ResponseEntity<>(responseBuilder.build("02", error), status);
    }

    return new ResponseEntity<>(response, response.getStatus());

}

字符串错误=BindingResult.GetAllErrors().Get(0).GetDefaultMessage()

您可以使用上面的代码行得到错误信息。

如果您的API请求有多个需要验证的请求参数,请使用下面提到的代码行捕获错误消息。否则,API会得到不同的错误消息,这是您在代码库中经常提到的(零星问题)

if (bindingResult.hasErrors()) {
        String error = bindingResult.getAllErrors().get(0).getDefaultMessage();

        if (bindingResult.getAllErrors().size() == 1) {
            return new ResponseEntity<>(responseBuilder.build("02", error), status);

        } else {
            return new ResponseEntity<>(
                    responseBuilder.build("02", "mandatory parameters can not be 
            empty, null or invalid"), status);

        }
    }
 类似资料:
  • Apache可以让网站管理员自己自定义对一些错误和问题的响应。 自定义的响应可以定义为当服务器检测到错误或问题时才被激活。 如果一个脚本崩溃并产生"500 Server Error"响应,那么这个响应可以被更友好的提示替换或者干脆用重定向语句跳到其他的URL(本地的或外部的)。 行为 老式的行为 Apache1.3 会响应一些对于用户没有任何意义的错误或问题信息,而且不会将产生这些错误的原因写入日

  • 给Rest服务打电话 http://acme.com/app/widget/123 返回: 此客户端代码的工作原理是: 但是,http://acme.com/app/widget/456返回: 但此客户端代码引发了一个异常: 我试过: 第二次调用只是抛出了另一个HttpClientErrorException,而且它觉得调用服务两次是不对的。 是否有一种方法可以调用该服务一次,并在成功时将响应解析

  • 然而,这产生了(正如怀疑的那样)完全不同的反应:

  • 我正在努力裁剪javax。验证。ConstraintValidator和javax。验证。根据我的需要限制ValidatorContext。我从格式错误的请求正文收到的响应消息始终采用以下形状: <代码> 此消息也以500而不是400错误请求的形式返回。我无法获得工作到解决方案来执行以下操作: 仅包括<代码> 我有以下代码: 向上面的代码发送格式错误的有效负载将导致如下消息: 我希望能够收到以下信

  • 问题内容: 我已经编写了REST API服务,该服务要求所有响应均为JSON。但是,当Go HTTP请求解析器遇到错误时,它将返回400作为纯文本响应,而无需调用我的处理程序。例: 请注意无效的授权标头。当然,400是正确的响应,但是当然是文本/纯文本。有什么方法可以配置Go http解析器以使用自定义错误响应媒体类型和主体? 问题答案: 你不能 您可以在net / http源中找到它,只有在请求