У меня следующий случай:
// MyService:
@Async
public CompletableFuture<MyObject> findMyObjectAsync(){
// .... logic goes here
// if error happens:
return CompletableFuture.completeExceptionally(new IllegalStateException());
}
// MyController:
public CompletableFuture<MyObject> search(){
return myService.findMyObjectAsync();
}
Итак, вместо того, чтобы получить исключение: IllegalStateException
от контроллера, это будет CompletionException
.Так как в этом случае асинхронный перехватчик: org.springframework.aop.interceptor.AsyncExecutionInterceptor#doSubmit
включает исключение в CompletionException
.
И затем ReturnValueHandler
из CompletableFuture
: org.springframework.web.servlet.mvc.method.annotation.DeferredResultMethodReturnValueHandler
не un оберните CompletionException
.
Временные решения : Многие из них, например, используют возврат DeferredResult
или ListenableFuture
или используют Callable
и избегают @Async
и AsyncExecutionInterceptor
аннотация вообще.
Предлагаемое решение : в проверке DeferredResultMethodReturnValueHandler
, если исключение заключено в CompletionException
, разверните его.