提问人:Vishal 提问时间:11/8/2023 更新时间:11/8/2023 访问量:21
相同的响应,不同的方法在Spring中提供不同的错误输出
Same response different method provides different Error output in Spring
问:
假设我有一个 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");
}
- 我知道我们应该得到错误代码500,并显示Spring默认错误输出消息, 但是得到 406 为什么???
{
"timestamp": "2023-11-08T00:41:58.682+00:00",
"status": 406,
"error": "Not Acceptable",
"path": "/employee/m1"
}
- 当我尝试在 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默认错误消息。
请帮助了解我缺少的流程和内部工作?谢谢
答:
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
评论
ErrorResponse
@ResponseBody