相同的响应不同的方法在Spring中提供不同的Error输出

vxbzzdmp  于 2023-11-16  发布在  Spring
关注(0)|答案(1)|浏览(104)

假设我有一个errorResponse类,没有getter和setter(故意)来理解错误输出的区别。

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中抛出一个错误时,如下所示,并在@ ExceptionError下处理它,我得到了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"
}


注意事项:如果我错了请纠正我,我确实理解代码没有问题,错误是Jackson部分无法解析ErrorResponse到JSON。但我不明白为什么两个不同的输出,预期错误应该是Spring默认错误消息,错误代码为500。
请帮助了解流程和内部工作我失踪?谢谢

mgdq6dx1

mgdq6dx11#

在第一种情况下,返回406是因为在ErrorResponse的序列化过程中发生了错误。代码在AbstractMessageConverterMethodProcessor的第322行,后续执行正常结束。
第二种情况是执行接口时抛出的异常被异常处理程序捕获,然后在异常处理程序返回的ErrorResponse序列化过程中发生错误,也就是说在异常处理程序执行过程中发生了错误,但是没有抛出异常,直接返回null,代码在ExceptionHandlerExceptionResolver的第422行,最后,异常被转换为ServletException,并在StandardWrapperValve的第198行将响应设置为error。最后,执行tomcat的ErrorPage。
我用的 Spring Boot 版本是3.1.5

相关问题