我正在尝试捕获@RestController 中的错误。
我展示了我正在玩的模型:
public class CreateUpdateTodoDto {
private Long userId;
@NotNull(message = "The TODO title must not be null")
@Size(min=1, max=3, message = "Title size too large, maximum < 4")
private String title;
@NotNull
private boolean completed;
}
我展示了 RestController
@PostMapping("/")
public ResponseEntity<?> insert(@RequestBody @Valid CreateUpdateTodoDto dto, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
throw new TodoConstrainValidationException(bindingResult.getAllErrors().get(0).getDefaultMessage());
}
return ResponseEntity.status(HttpStatus.CREATED).body(todoService.insert(dto));
}
@PutMapping("/{id}")
public ResponseEntity<?> update(@RequestBody @Valid CreateUpdateTodoDto dto,
@PathVariable("id") int id,
HttpServletRequest request,
BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
throw new TodoConstrainValidationException(bindingResult.getAllErrors().get(0).getDefaultMessage());
}
return ResponseEntity.ok().body(todoService.update(dto, id, request));
}
在插入方法中,如果我发送一个无效对象,它会正确检测它并按我的预期抛出异常,这对我来说都是正确的。问题来自于 put 方法,如果我发送一个无效的对象,我只会收到一个空体和状态 400 的响应,现在如果我删除参数@PathVariable ("id") int id和HttpServletRequest request,它正常工作。因为如果你有这两个参数(int id 和 HttpServletRequest 请求),它的工作方式就不一样了?我给你留下了我从邮递员那里得到的回复的照片。
在这里我已经迷路了,我可以消除我之前评论过的 2 个参数,它会起作用,但我不知道为什么会这样。
谢谢!
参数顺序很重要,BindingResult
需要在您进行验证的请求正文之后。修改PuttMapping
如下。
@PutMapping("/{id}")
public ResponseEntity<?> update(@RequestBody @Valid
CreateUpdateTodoDto dto, BindingResult bindingResult,
@PathVariable("id") int id,
HttpServletRequest request )
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句