@seenukarthi实际上是正确的.您必须在端点上使用@Valid
才能使请求正文有效.
Note:验证错误在错误响应中不可见.
错误将显示在控制台日志(log)中.例如:
2023-11-20T13:12:13.057+05:30 WARN 85261 --- [nio-8081-exec-1] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.bind.MethodArgumentNotValidException: Validation failed for argument [0] in public org.springframework.http.ResponseEntity<java.lang.Object> com.example.TestController.create(com.example.MyRequestResult) with 2 errors: [Field error in object 'myRequestResult' on field 'name': rejected value [[]]; codes [NotEmpty.model.name,NotEmpty.name,NotEmpty.java.util.List,NotEmpty]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [model.name,name]; arguments []; default message [name]]; default message [List of name must not be empty]] [Field error in object 'model' on field 'name': rejected value [[]]; codes [Size.model.name,Size.name,Size.java.util.List,Size]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [model.name,name]; arguments []; default message [name],2147483647,1]; default message [List of name must have at least one element]] ]
请仔细查看日志(log).它会在那里的.
现在,如果您想要捕获请求正文上发生的验证错误并将其包括到响应中,那么您必须使用org.springframework.validation.BindingResult
.
让我举一个例子来说明:
如果可能,更新ExecutionResultDTO
以列出错误:
@Data
public class ExecutionResultDTO {
private List<String> name;
private List<String> errors;
}
更新了我用于测试的控制器:
import jakarta.validation.Valid;
import org.springframework.context.support.DefaultMessageSourceResolvable;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
@RestController
public class TestController {
@PostMapping("create")
public ResponseEntity<ExecutionResultDTO> create(@Valid @RequestBody MyRequestResult myRequestResult, BindingResult bindingResult) {
ExecutionResultDTO dto = new ExecutionResultDTO();
dto.setName(myRequestResult.getName());
if (bindingResult.hasErrors()) {
dto.setErrors(bindingResult.getFieldErrors().stream()
.map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.toList()));
return new ResponseEntity<>(dto, HttpStatus.BAD_REQUEST);
}
return new ResponseEntity<>(dto, HttpStatus.CREATED);
}
}
postman :
对于不正确的数据:
对于正确的数据:
相应地更改逻辑.这只是一个例子.