今天我遇到了一个错误,我确实解决了它,但我无法理解为什么会以这种方式发生错误。
所以我只是尝试使用 Spring Boot 并使用 @RestController 构建示例应用程序,我使用“spring-boot-starter-validation”作为我的用户输入验证。
我的restcontroller端点方法是这样的
@PostMapping("/newEmployee")
@ApiOperation(value = "creates a new employee",
response =EmployeeDTO.class)
public EmployeeDTO newEmployee(@Valid @RequestBody EmployeeDTO newEmployee) {
employeeValidator.validateEmployeeDTO(newEmployee);
return employeeManagementBO.saveOrUpdateEmployee(newEmployee);
}
然后我定义了一个如下所示的处理程序方法
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(MethodArgumentNotValidException.class)
//note that if @ResponseBody is not annotated here, you may get weird error like 404 or 401
@ResponseBody
public Map<String, String> handleValidationExceptions(
MethodArgumentNotValidException ex) {
Map<String, String> errors = new HashMap<>();
ex.getBindingResult().getAllErrors().forEach((error) -> {
String fieldName = ((FieldError) error).getField();
String errorMessage = error.getDefaultMessage();
errors.put(fieldName, errorMessage);
});
System.out.println("error caught...");
return errors;
}
因此,如果我删除@ResponseBody,当我使用 PostMan 测试端点时,我会收到错误代码 404(但我进行了调试并看到处理程序方法已运行),这意味着在返回错误后,我会收到 404 错误。 但是,如果我使用 @ResponseBody 对其进行注释,那么一切都会按预期进行,并且我会在地图中返回带有预期错误结构的 JSON 响应正文。
所以我可以理解 @ResponseBody 将我的返回值作为端点的响应,但我的问题是 404 错误是如何发生的?此外,如果我将返回类型设为字符串,则会收到 405 错误(说不允许使用“POST”)。
如果没有@ResponseBody,有人知道发生了什么吗?是否有任何用例可以不使用 @ResponseBody 对其进行注释?