我收到以下错误
[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
。