我正在尝试使用Java Spring启动来构建TODO应用程序。在控制器层添加了一个验证,以确保创建API的待办事项名称长度在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等)添加“消息”属性。当您尝试发出失败请求时,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注释(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());
}
字符串错误= 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);
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句