You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CommerceTools Java SDK v1转v2:如何实现全量Product列表导出?

CommerceTools Java SDK v2 全量产品列表提取实现方案

核心变化说明

SDK v2 中ProductQuery的API结构发生调整,默认推荐使用**ProductProjectionQuery**查询产品投影(若需原始Product对象,也可使用ProductQuery,API结构类似),同时移除了v1中的findNext方法,需通过分页结果的nextPage标记实现全量遍历。

实现代码示例

以下是对应v1功能的v2迁移代码,保留异步处理逻辑,适配3万条产品的全量提取场景:

import com.commercetools.api.client.ApiRoot;
import com.commercetools.api.models.product.Product;
import com.commercetools.api.models.product.ProductQuery;
import com.commercetools.api.models.product.ProductQueryBuilder;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionStage;

// 假设已初始化ApiRoot实例(对应v1中的connCT)
public List<Product> fetchAllProducts(List<String> productTypeIds, ApiRoot apiRoot) {
    // 1. 构建初始查询:指定产品类型过滤、ID升序、分页大小,关闭总数统计
    final ProductQuery seedQuery = ProductQueryBuilder.of()
            .predicates(p -> p.productType().id().isIn(productTypeIds))
            .sort(s -> s.id().asc())
            .limit(ProjectConstants.PAGE_SIZE)
            .fetchTotal(false)
            .build();

    // 2. 异步遍历所有分页并累加结果
    CompletionStage<List<Product>> allProductsStage = fetchAllPages(apiRoot, seedQuery, new ArrayList<>());

    // 3. 获取最终结果并排序
    List<Product> actualProducts = allProductsStage.toCompletableFuture().join();
    return actualProducts.stream()
            .sorted(Comparator.comparing(Product::getId))
            .toList();
}

// 分页遍历工具方法
private CompletionStage<List<Product>> fetchAllPages(ApiRoot apiRoot, ProductQuery query, List<Product> accumulated) {
    return apiRoot.products()
            .query()
            .withQuery(query)
            .execute()
            .thenCompose(result -> {
                accumulated.addAll(result.getResults());
                // 判断是否存在下一页,递归查询
                if (result.getNext() != null) {
                    ProductQuery nextQuery = ProductQueryBuilder.of(query)
                            .withPage(result.getNext().getPage())
                            .build();
                    return fetchAllPages(apiRoot, nextQuery, accumulated);
                } else {
                    return CompletableFuture.completedFuture(accumulated);
                }
            });
}

关键细节说明

  • 查询构建方式:v1的ProductQuery.of()替换为v2的ProductQueryBuilder.of()链式构建模式,Predicate语法逻辑一致但调用方式调整为Lambda形式。
  • 分页逻辑替换:通过PagedQueryResult.getNext()判断下一页存在性,使用withPage()构建下一页查询,递归累加所有页结果。
  • 异步模型延续:保留v1的CompletionStage异步处理,避免大数据量查询阻塞主线程。
  • 投影兼容:若业务需要包含价格、库存等动态数据的产品投影,只需将ProductQuery替换为ProductProjectionQuery,调用逻辑完全一致。

内容的提问来源于stack exchange,提问作者MiguelHoz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 08:12:49