Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SpringBootAPI自定义错误响应契约_Java_Spring_Rest_Api_Spring Boot - Fatal编程技术网

Java SpringBootAPI自定义错误响应契约

Java SpringBootAPI自定义错误响应契约,java,spring,rest,api,spring-boot,Java,Spring,Rest,Api,Spring Boot,我正在尝试用JavaSpring引导构建一个TODO应用程序。在控制器层添加了一个验证,以确保创建API的我的todo名称长度介于2和10之间。我已配置为返回以下成功响应: { "success": true, "data": {"name": "hello", "completed": false}, "errors": [] } 我想返回同样的合同,在失败的情况下,以及。但是当我尝试发出一个失败的请求(名称大于10个字符)时,服务器不知何故返回了以下响应 { "timestam

我正在尝试用JavaSpring引导构建一个TODO应用程序。在控制器层添加了一个验证,以确保创建API的我的todo名称长度介于2和10之间。我已配置为返回以下成功响应:

{
  "success": true,
  "data": {"name": "hello", "completed": false},
  "errors": []
}
我想返回同样的合同,在失败的情况下,以及。但是当我尝试发出一个失败的请求(名称大于10个字符)时,服务器不知何故返回了以下响应

{
"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) 首先,为所有@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)在控制器(API定义)中捕获这些无效场景,如下所示。此外,您还应该为您的请求主体使用@Valid annotation(CreateTodoContract),否则服务器将针对您在问题中提到的无效场景重新调整响应

@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());

}
@PostMapping(value=“createTodoContract”)
public ResponseEntity CreateTodoContract(@Valid@RequestBody
创建todocontract
createTodoContractRequest,
BindingResult(绑定结果){
if(bindingResult.hasErrors()){
字符串错误=bindingResult.getAllErrors().get(0.getDefaultMessage();
返回新的ResponseEntity(responseBuilder.build(“02”,错误),状态);
}
返回新的ResponseEntity(response,response.getStatus());
}
字符串错误=bindingResult.getAllErrors().get(0).getDefaultMessage()

您可以使用上面的代码行获取错误消息

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

if(bindingResult.hasErrors()){
字符串错误=bindingResult.getAllErrors().get(0.getDefaultMessage();
if(bindingResult.getAllErrors().size()==1){
返回新的ResponseEntity(responseBuilder.build(“02”,错误),状态);
}否则{
返回新响应(
responseBuilder.build(“02”),不能使用强制参数
空、空或无效状态);
}
}
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);

        }
    }