发布于2026-07-15 阅读(0)
扫一扫,手机访问
说起统一异常处理,后端开发中其实有非常成熟的模式——@ControllerAdvice配合@ExceptionHandler,再搭配一个自定义的ErrorResponse实体,就能优雅地搞定。这套方案的好处在于,它让错误响应变得结构清晰,前端调用方拿到后一目了然,不用再费劲解析各种乱七八糟的异常格式。

在Spring Boot中,要实现带有timestamp、path、error、status这几个字段的响应结构,推荐直接上@ControllerAdvice + @ExceptionHandler,配合自定义的响应体。
先创建一个通用的响应类,比如就叫ErrorResponse,把异常时需要返回的核心字段封装进去:
timestamp:用Instant.now()或LocalDateTime.now(),更推荐Instant,避免时区歧义,谁用谁知道。path:从请求上下文中获取当前请求路径,常见做法是通过WebRequest或HttpServletRequest拿到。error:异常的描述,简明扼要就行,比如"Bad Request"或"Internal Server Error",直接取HttpStatus的getReasonPhrase()即可。status:HTTP状态码,整型,400、404、500这些,清晰明了。用@ControllerAdvice来捕获所有控制器抛出的异常,然后构造ErrorResponse返回:
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public ResponseEntity handleGenericException(
Exception ex, WebRequest request) {
HttpStatus status = (ex instanceof HttpClientErrorException)
? ((HttpClientErrorException) ex).getStatusCode()
: HttpStatus.INTERNAL_SERVER_ERROR;
ErrorResponse errorResponse = new ErrorResponse(
Instant.now(),
request.getDescription(false), // 默认带uri=xxx,需要纯净path的话可以注入HttpServletRequest
status.getReasonPhrase(),
status.value()
);
return ResponseEntity.status(status).body(errorResponse);
}
}
这里有个小细节:request.getDescription(false)返回的是"uri=xxx"这种格式,如果想拿到干净纯粹的path,建议直接注入HttpServletRequest,调用getServletPath()或getRequestURI()。
针对不同异常类型,返回更精准的状态码和错误信息,效果会更好:
@ResponseStatus(HttpStatus.NOT_FOUND)的异常(像UserNotFoundException),就可以单独捕获,设置error="Not Found"、status=404。MethodArgumentNotValidException对应参数校验失败,提取第一个校验错误的defaultMessage作为error,状态码给400。HttpRequestMethodNotSupportedException直接返回error="Method Not Supported",状态码405。在ErrorResponse类里,加上Lombok注解或者手动写getter/setter,再用@JsonFormat规范一下时间格式:
public class ErrorResponse {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss.SSS")
private Instant timestamp;
private String path;
private String error;
private int status;
// 构造方法、getter、setter...
}
这样最终返回的JSON就是标准格式,比如:
{ "timestamp": "2024-06-15 14:22:33.123", "path": "/api/users/999", "error": "Not Found", "status": 404 }
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8