【问题标题】:CompletableFuture always throws 500 Internal Server ErrorCompletableFuture 总是抛出 500 Internal Server Error
【发布时间】:2021-06-19 08:15:38
【问题描述】:

我正在使用 Spring Boot 运行 Web 服务。下面的 sn-p 来自控制器。 我有一个自定义异常类(它扩展了 RuntimeException)。为了处理异常,我也有一个控制器建议。

当 someMethod() 抛出自定义异常时,我预计会收到 400 - 错误请求。但是,compleable future 限制了异常,我总是收到 500 - Internal Server Error。

CompletableFuture.supplyAsync(() -> {
      return someMethod();
}
).whenCompleteAsync((response, throwable) -> {
  
});

控制器建议

@ControllerAdvice
public class CustomExceptionHandler extends Throwable {


@Order(Ordered.HIGHEST_PRECEDENCE)
@ExceptionHandler(value = CustomException.class)
public ResponseEntity<ErrorResponse> handleCustomException(
  CustomException ex) {
ErrorResponse errorResponse = new ErrorResponse();
errorResponse.setCode("400");
errorResponse.setDescription(ex.getMessage());
return new ResponseEntity<>(errorResponse, new HttpHeaders(), HttpStatus.BAD_REQUEST);
 }


@ExceptionHandler(value = Exception.class)
public ResponseEntity<ErrorResponse> handleGenericExceptions(Exception exception) {

ErrorResponse errorResponse = new ErrorResponse();
errorResponse.setCode("500");
errorResponse.setDescription(exception.getMessage());
return new ResponseEntity<>(errorResponse, new HttpHeaders(), HttpStatus.INTERNAL_SERVER_ERROR);
  }
 }

如果我在可完成的未来之外抛出自定义异常,我会得到预期的 400 - 错误请求。另一方面,如果我没有全局异常处理程序,我会得到 400 Bad Request,即使它是在可完成的未来内抛出的。但是,两者都不能接受。我这样做是为了找到根本原因。

如何处理这种情况?

【问题讨论】:

  • 您使用的是异步,因此控制器线程中不会发生异常,这意味着它没有被通知捕获。不确定 500 来自哪里,您需要为此发布控制器的其余部分。
  • 它被建议抓住了。我尝试更改建议中“handleGenericExceptions()”中的描述。在这种情况下,我在响应中收到了更新的描述。我提到了我尝试过的其他事情。异常被通知捕获。这是肯定的。
  • 您能否分享更多错误日志或更清楚完整的堆栈跟踪?

标签: java spring multithreading spring-boot completable-future


【解决方案1】:

当使用 Completable Future 调用底层逻辑时,无论捕获到哪些异常,所有异常都将被 Completable Future 包装并作为 CompletionException 抛出。 因此,我们必须处理 CompletionException 并从全局处理程序返回适当的响应,或者当您调用某个方法时,自己捕获异常,而不是重新抛出它,创建响应对象(带有错误代码和描述)你想发送和返回对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    • 2017-09-06
    • 2019-12-28
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 2021-06-02
    相关资源
    最近更新 更多