jackson 如何< T>从可补充的未来〈AnotherType>返回可补充的未来〈MyType< T>>

siotufzp  于 2022-11-08  发布在  其他
关注(0)|答案(1)|浏览(136)

我正在尝试实现一个通用的REST客户端,如下所示。我有自己的模型来将HTTP响应表示为Response T。这里的T是服务调用的返回类型,它可以只是T或T的列表。下面的代码无法编译,这就是我需要帮助的地方。如果你知道完成同样任务的更好的方法,你可以提出建议。
第一个
并最终调用如下所示的方法,

@Test
    void getAsync() {
        // Arrange
        var baseUrl = settings.get("api.baseUri");
        var options = new UriOptions(baseUrl, "students/6277aade6f047803e8ae4bcf");
        var headers = new Headers(new HashMap<String, String>(), new HashMap<String, String>());

        // Act
        var response = restApiClient.<Student>getAsync(options, headers);

        // Assert
        response.thenAccept((r) ->
        {
            Assertions.assertEquals(200, r.getStatusCode());
        });
    }
pbossiut

pbossiut1#

若要回答标题中的问题“如何从CompletableFuture返回CompletableFuture“:通常会使用thenApply和friends:

final CompletableFuture<String> future = CompletableFuture.supplyAsync(() => "42");
final CompletableFuture<Integer> intFuture = future.thenApply(Integer::parseInt);
// or future.thenApply(s -> Integer.parseInt(s));
// or future.thenApply(s -> { return Integer.parseInt(s); });

查看您的具体代码,thenComposeAsync的lambda中似乎存在语法错误(它由两个 CompletableFuture 示例组成,因此其lambda需要返回另一个CompletableFuture示例,而不是值本身)。
由于它不做任何代价高昂的工作,因此异步转换值显得有些多余。一个简单的thenApply就可以很好地完成这项工作:

return response.thenApply(r -> {
    try {
         return new Response<T>(
                r.statusCode(),
                HttpUtils.headersToMap(r.headers().map()),
                objectMapper.readValue(r.body(), new TypeReference<T>() {}),
                HttpUtils.isSuccess(r.statusCode()), r.uri()
        );
    } catch (JsonProcessingException e) {
        throw new RuntimeException(e);
    }
});

如果你坚持使用thenCompose,那么你需要将你的结果 Package 在另一个CompletableFuture中:

return response.then(r -> {
    try {
         return CompletableFuture.completedFuture(new Response<T>(
                r.statusCode(),
                HttpUtils.headersToMap(r.headers().map()),
                objectMapper.readValue(r.body(), new TypeReference<T>() {}),
                HttpUtils.isSuccess(r.statusCode()), r.uri()
        ));
    } catch (JsonProcessingException e) {
        throw new RuntimeException(e);
    }
});

相关问题