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
相关产品推荐
相关产品推荐

