DeferredResultMethodReturnValueHandler需要打开CompletionException

时间:2019-02-03 20:15:39

标签: java spring-mvc

我有以下情况:

// 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中的CompletableFutureorg.springframework.web.servlet.mvc.method.annotation.DeferredResultMethodReturnValueHandler不会取消包装CompletionException

解决方法: 实际上,很多东西,例如return使用DeferredResultListenableFuture,或使用Callable并完全避免使用@AsyncAsyncExecutionInterceptor注释。

建议的解决方案: 在DeferredResultMethodReturnValueHandler中检查异常是否包裹在CompletionException中,然后将其展开。

0 个答案:

没有答案