今天我遇到了一个错误,我解决了它,但是我很难理解为什么错误会这样发生。
所以我只是在试验springboot,并用@restcontroller构建一个示例应用程序,我使用“springbootstartervalidation”作为我的用户输入验证。
我的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响应体,并在Map中返回预期的错误结构。
所以我可以理解@responsebody将返回值作为端点的响应,但我的问题是404错误是如何发生的?另外,如果我将返回类型设置为字符串,则会出现405错误(表示不允许使用“post”)。
有人知道没有@responsebody,会发生什么吗?有没有不使用@responsebody注解它的用例?
暂无答案!
目前还没有任何答案,快来回答吧!