发生验证错误时出现 401 和 404 错误

时间:2021-04-20 15:03:08

标签: spring spring-boot validation spring-restcontroller spring-validator

今天我遇到了一个错误,我确实解决了它,但我无法理解为什么会以这种方式发生错误。

所以我只是尝试使用 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 对其进行注释?

0 个答案:

没有答案