簡體   English   中英

處理 controller 中的 CompletableFuture 異常

[英]Handling CompletableFuture exceptions in controller

我正在嘗試為我正在運行的項目進入CompletableFuture class ,我在這里遇到了一些問題:

有以下方法:通過ID或hash嘗試查找會話; 如果沒有找到,它會拋出異常。 到目前為止,一切都很好。

public ConversationOutput getConversationByIdOrHash(String conversationIdOrHash)
            throws ConversationNotFoundException {
        Conversation conversation = this.conversationRepository.getByIdOrHash(conversationIdOrHash);

        if (conversation == null) {
            throw new ConversationNotFoundException(conversationIdOrHash);
        }

        return this.modelMapper.map(conversation, ConversationOutput.class);
    }

請注意,我正在從我的方法簽名中拋出ConversationNotFoundException 我的 SpringBoot controller 正在對此異常做出反應,並且從一開始就一切正常。

我想要做的是使它成為CompletableFuture返回並實際拋出異常,類似於:

    public CompletableFuture<ConversationOutput> getConversationByIdOrHashAsync(String conversationIdOrHash)
            throws ConversationNotFoundException {
        return CompletableFuture.supplyAsync(() -> this.getConversationByIdOrHash(conversationIdOrHash));
}

我看過人們使用exceptionally處理異常的帖子,但我真正想做的是將它扔到我的 controller 並讓它處理它。 關於如何制作的任何建議?

謝謝你們!

問題是您是否關心CompletableFuture的結果。 CompletableFuture就像一個特殊的任務,它在其他線程上處理。 如果您不調用.join() ,您將不會收到CompletableFuture的結果。 如果發生任何異常,此方法也將傳播異常。 但是,它等待CompletableFuture完成並阻止請求。 但是,沒有等待就無法從CompletableFuture內部獲取異常,您必須像對待其他任務一樣對待它。

如果成功,您可以傳遞已完成的未來,以及失敗的未來以及您的自定義異常。

public CompletableFuture<ConversationOutput> getConversationByIdOrHashAsync(String conversationIdOrHash) {
        try {
            return CompletableFuture.completedFuture(this.getConversationByIdOrHash(conversationIdOrHash));
        } catch (ConversationNotFoundException e) {
            return CompletableFuture.failedFuture(e);
        }
    }

然后在您的 controller 級別,您可以處理異常。

final CompletableFuture<ConversationOutput> future = getConversationByIdOrHashAsync("idOrHash");
        future.whenComplete((r, e) -> {
            if (e != null) {
                if (e instanceof ConversationNotFoundException) {
                    //handling
                }
            }
        });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM