我收到以下错误

[ERROR] AccountServiceResource.java:[165,38] incompatible types: bad return type in lambda expression
[ERROR] Response<okio.ByteString> cannot be converted to java.util.concurrent.CompletionStage<Response<okio.ByteString>>

关于以下行
return checkExceptionCauses(exception);

其中checkedExceptionCauses是返回Response<ByteString>的方法
private Response<ByteString> checkExceptionCauses(Throwable exception) {
     // ...
}

问题是,为什么它突然尝试将其转换为CompletionStage<>?这是经过良好编译的原始代码(的简化版本):
private CompletionStage<Response<ByteString>> getAccountById(RequestContext rc) {
    return accountServiceClient.getAccount().thenApply( getAccountResponse -> {
      AdAccountResponse payload;
      payload.map(getAccountResponse);
      return Response.forPayload(serializePayload(payload));
    }).exceptionally(exception -> {
      LOG.error("Lorem ipsum");
      return checkExceptionCauses(exception);
    });
}

如此看来,我们返回的是.thenApply().exceptionally()。 (不可否认,我对可完成的 future 并不精通,所以也许这就是为什么我在这里感到困惑的原因。)

但是,好的,我觉得我的修改可以完成以下操作:
private CompletionStage<Response<ByteString>> getAccountById(RequestContext rc) {
    return accountServiceClient.getAccount().thenApply( getAccountResponse -> {
      AdAccountResponse payload;
      payload.map(getAccountResponse);

      // *** BEGIN CHANGES *** //
      Request salesforceRequest = Request.forUri(FORCEIT_GET_BUSINESS_INFO_URI, "GET").withPayload(businessInfoRequestPayload);
      return httpClient.send(salesforceRequest, rc).thenApply(salesforceResponse -> {
        if (salesforceResponse.payload().isPresent()) {
          // ...
        } else {
          // ...
        }
        AdAccountResponse payload;
        payload.map(getAccountResponse);
        return Response.forPayload(serializePayload(payload));
      });
      // *** END CHANGES *** //

    }).exceptionally(exception -> {
      LOG.error("Lorem ipsum");
      return checkExceptionCauses(exception);
    });
}

我要做的就是添加另一层.thenApply()。但是我的内部.thenApply()返回的是原始代码返回的东西,而我的外部.thenApply()只是将其传递了。

那么,为什么我现在突然间抱怨转换为CompletionStage?我只是为了踢而尝试过这个:
return CompletableFuture.completedFuture(checkExceptionCauses(exception));

毫不奇怪,我现在对返回CompletionStage<Response<ByteString>>而不是Response<ByteString>提出了更高的要求。

最佳答案

如果您具有同步映射功能,则使用thenApply

根据Documentation:



另一方面,如果您具有返回thenCompose的异步映射函数,则使用CompletableFuture。换句话说,thenCompose直接返回带有结果的Future,而不是嵌套的Future。

Documentation:



因此,尝试用thenApply替换thenCompose

07-26 09:27