java - 返回 OkHttp 异步结果有问题

标签 java okhttp

我有一个java SDK,它使用OkHttp客户端(4.0.0)从IAM获取 token > 服务器并返回token给应用程序。关系可能是这样的:应用程序同步调用SDKSDK异步调用IAM。引用这个答案Java - Retrieving Result from OkHttp Asynchronous GET ,代码如下:

异步类:

class BaseAsyncResult<T> {
private final CompletableFuture<T> future = new CompletableFuture<>();

T getResult() {
    try {
        return future.get();
    } catch (InterruptedException | ExecutionException e) {
        e.printStackTrace();
    }
    return null;
}

void onFailure(IOException e) {
    future.completeExceptionally(e);
}

void onResponse(Response response) throws IOException {
    String bodyString = Objects.requireNonNull(response.body()).string();
    future.complete(IasClientJsonUtil.json2Pojo(bodyString, new TypeReference<T>() {}));
}
}

Okhttp 调用如下:

public void invoke(Request request, BaseAsyncResult result) {
        okHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(@NotNull Call call, @NotNull IOException e) {
                result.onFailure(e);
            }

            @Override
            public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
                result.onResponse(response);
            }
        });
    }

应用程序使用 sdk 代码,例如,iasClient 是 okhttp 客户端的包装器:

 BaseAsyncResult<AuthenticationResponse> iasAsyncResult = new BaseAsyncResult();
 iasClient.invoke(request, iasAsyncResult);
 AuthenticationResponse result = iasAsyncResult.getResult();

错误消息:

java.lang.ClassCastException:java.util.LinkedHashMap 无法转换为 x.x.x.AuthenticationResponse

我错过了什么?

最佳答案

您需要确保 jackson 知道将值反序列化到哪个类。在本例中,您要求 Jackson 反序列化对 TypeReference 的响应,默认情况下它将解析为 Map ,除非您指定类(在本例中为 AuthenticationResponse )。因此,Future 解析为 linkedHashMap 并导致类转换。 尝试替换下面的行。

future.complete(IasClientJsonUtil.json2Pojo(bodyString, new TypeReference<T>() {}));

future.complete(IasClientJsonUtil.json2Pojo(bodyString, new TypeReference<AuthenticationResponse>() {}));

关于java - 返回 OkHttp 异步结果有问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57147132/

相关文章:

java - 在 Eclipse 中调试代码。内循环案例

java - 尝试构建在负字符集中使用负前瞻的正则表达式

java - JSON 模式到 POJO - 枚举作为一个单独的 java 文件

ssl - java.security.cert.CertPathValidatorException : Trust anchor for certification path not found. 网络

java - 如何使用 okhttp 删除 header "accept-encoding:gzip"

java - Spring Boot 管理和日志记录

java - Android - 使用来自网络的字符串作为对象枚举

java - 无法停止 retrofit 发送

android - 从 Android 中的文件加载 SVG

android - 从 Android 应用程序连接到受 SSL 保护的服务器