相同的响应,不同的方法在Spring中提供不同的错误输出

Same response different method provides different Error output in Spring

提问人:Vishal 提问时间:11/8/2023 更新时间:11/8/2023 访问量:21

问:

假设我有一个 errorResponse 类,没有 getter 和 setter(故意)来理解 Error Output 的差异。

class ErrorResponse {
    private String field;
    private String message;

    public ErrorResponse(String field, String message) {
        this.field = field;
        this.message = message;
    }
}

现在假设我们有一个 GetMapping

@GetMapping("/m1")
public ErrorResponse m1(HttpServletRequest request) {
    System.out.println("m1()....");
    return new ErrorResponse("abc", "jhfjd");
}
  1. 我知道我们应该得到错误代码500,并显示Spring默认错误输出消息, 但是得到 406 为什么???
    {
        "timestamp": "2023-11-08T00:41:58.682+00:00",
        "status": 406,
        "error": "Not Acceptable",
        "path": "/employee/m1"
    }
  1. 当我尝试在 m1 中抛出一个错误(如下所示)并在 @ExceptionHandler 下处理它时,我得到了预期的 Spring 默认错误,错误代码为 500。
 @GetMapping("/m1")
    public ErrorResponse m1(HttpServletRequest request) {
        System.out.println("m1()....");
        System.out.println(10/0);
        return new ErrorResponse("abc", "jhfjd");
    }
    
    @ExceptionHandler
    public ErrorResponse handleArithmeticException(ArithmeticException ex) {
        System.out.println("Ex-handleArithmeticException..........");
       return new ErrorResponse("abc", "1234");
    }

错误输出:

{
    "timestamp": "2023-11-08T00:49:44.577+00:00",
    "status": 500,
    "error": "Internal Server Error",
    "path": "/employee/m1"
}

注意:如果我错了,请纠正我,我确实明白代码没有问题,错误出在杰克逊部分,它无法将 ErrorResponse 解析为 JSON。 但是我不明白为什么两个不同的输出,预期的错误应该是错误代码为500的Spring默认错误消息。

请帮助了解我缺少的流程和内部工作?谢谢

Spring-MVC 异常

评论

0赞 Peng 11/8/2023
您是否尝试过添加 getter 和 setter ?,前面的错误发生在SpringFrame工作中,后面的错误发生在序列化中,没有getter和setter所以它无法将bean转换为返回字符串。两者之间的区别可能在于有一些注释喜欢或其他一些,将值键入为字符串?展示更多信息可能会有很大帮助ErrorResponse@ResponseBody

答:

0赞 DingHao 11/8/2023 #1

在第一种情况下,返回 406 是因为在序列化 ErrorResponse 期间发生错误。代码位于 AbstractMessageConverterMethodProcessor 的第 322 行,后续执行正常结束。

第二种情况是,执行接口时引发的异常被异常处理程序捕获,然后在异常处理程序返回的 ErrorResponse 序列化过程中发生错误。也就是说,在异常处理程序的执行过程中发生了错误,但没有抛出异常。它直接返回 null。代码位于 ExceptionHandlerExceptionResolver 的第 422 行中。最后,将异常转换为 ServletException,并在 StandardWrapperValve 的第 198 行中将响应设置为 error。最后,执行 tomcat 的 ErrorPage。

我使用的Spring Boot版本是3.1.5