【发布时间】: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