DeferredResultMethodReturnValueHandler необходимо развернуть исключение CompletionException - PullRequest
0 голосов
/ 03 февраля 2019

У меня следующий случай:

// 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, разверните его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...