spring boot 全局异常处理可以通过配置 @controlleradvice 结合 @exceptionhandler 来捕获请求超时异常。具体做法是定义一个全局异常处理器类,在其中添加处理 asyncrequesttimeoutexception 的方法,该方法返回自定义的 json 响应或错误页面。这样当请求处理时间超过服务器配置的超时时间时,框架会自动抛出该异常并被全局处理器捕获。

如何配置全局异常处理器以捕获 AsyncRequestTimeoutException
要捕获请求超时异常,需要创建一个继承自 ResponseEntityExceptionHandler 或直接使用 @RestControllerAdvice 注解的类。在该类中定义一个方法,并使用 @ExceptionHandler(AsyncRequestTimeoutException.class) 指定处理的异常类型。这个方法将接收到的异常对象作为参数,并返回一个 ResponseEntity 对象,其中包含状态码和错误信息。默认情况下,Spring Boot 的异步请求超时时间为 30 秒,可以通过修改 server.servlet.async.request-timeout 属性来调整这个值。

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.context.request.async.AsyncRequestTimeoutException;
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(AsyncRequestTimeoutException.class)
public ResponseEntity<string> handleTimeoutException(AsyncRequestTimeoutException ex) {
return ResponseEntity.status(HttpStatus.GATEWAY_TIMEOUT).body("请求处理超时,请稍后重试");
}
}</string>
上述代码定义了一个全局异常处理器,当发生 AsyncRequestTimeoutException 时,返回 HTTP 504 状态码和一条简单的错误消息。开发者可以根据实际需求定制返回的内容,例如返回 JSON 格式的错误详情。
如何在控制器中触发并验证超时异常的处理
为了验证全局异常处理器是否正常工作,可以在控制器中模拟一个耗时的操作,使其超过配置的超时时间。通过设置较短的超时时间并执行长时间运行的任务,可以确保触发 AsyncRequestTimeoutException。在测试过程中,观察返回的状态码和消息是否符合预期,从而确认异常处理机制的有效性。

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.concurrent.TimeUnit;
@RestController
public class TestController {
@GetMapping("/timeout")
public String triggerTimeout() throws InterruptedException {
// 模拟耗时操作,超过默认30秒超时
TimeUnit.SECONDS.sleep(35);
return "操作完成";
}
}
在上述控制器中,/timeout 接口会休眠 35 秒,超过了默认的 30 秒超时限制。当访问该接口时,如果全局异常处理器配置正确,将会收到 504 状态码和预设的错误消息。这证明了全局异常处理器能够成功捕获并处理请求超时异常。
基于程序中某个输入、条件或结果的具体问题
在实际应用中,请求超时可能由多种因素引起,如数据库查询缓慢、外部服务调用延迟等。了解这些具体原因有助于优化系统性能,减少超时发生的频率。此外,合理设置超时时间和重试机制也是提高系统稳定性的关键措施。











