401和404出错

bq8i3lrv  于 2021-07-14  发布在  Java
关注(0)|答案(0)|浏览(252)

今天我遇到了一个错误,我解决了它,但是我很难理解为什么错误会这样发生。
所以我只是在试验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注解它的用例?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题