From 359590b7d8a21f4b4f254f719c949587cdfbe41e Mon Sep 17 00:00:00 2001 From: luklpz Date: Thu, 14 May 2026 20:46:17 +0200 Subject: [PATCH] fix: discard PS POST response body, fetch created product via GET PS WebService POST response uses a different JSON structure for multilingual fields than GET responses, causing Jackson deserialization failures. Instead of parsing the POST body, discard it with toBodilessEntity() and fetch the created product via getProductByReference() which uses the stable GET format. Co-Authored-By: Claude Sonnet 4.6 --- .../prestashop/PrestashopClient.java | 28 ++++++------------- 1 file changed, 9 insertions(+), 19 deletions(-) diff --git a/sync-service/src/main/java/com/teterialosjuanjos/tfg/sync_service/integration/prestashop/PrestashopClient.java b/sync-service/src/main/java/com/teterialosjuanjos/tfg/sync_service/integration/prestashop/PrestashopClient.java index 54bffa7..9735506 100644 --- a/sync-service/src/main/java/com/teterialosjuanjos/tfg/sync_service/integration/prestashop/PrestashopClient.java +++ b/sync-service/src/main/java/com/teterialosjuanjos/tfg/sync_service/integration/prestashop/PrestashopClient.java @@ -3,7 +3,6 @@ package com.teterialosjuanjos.tfg.sync_service.integration.prestashop; import com.teterialosjuanjos.tfg.sync_service.config.IntegrationProperties; import com.teterialosjuanjos.tfg.sync_service.integration.prestashop.dto.*; import lombok.extern.slf4j.Slf4j; -import com.fasterxml.jackson.databind.JsonNode; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.http.MediaType; import org.springframework.stereotype.Component; @@ -86,19 +85,18 @@ public class PrestashopClient { } /** - * Creates a new product in PrestaShop. - * PS WebService requires XML request body even when {@code output_format=JSON} is set. + * Creates a new product in PrestaShop and returns it with its assigned PS id. * - *

The POST response JSON wraps multilingual fields differently from GET - * (e.g. {@code {"language":[...]}} instead of a flat array), so the response - * is parsed as a raw {@link JsonNode} and only the assigned {@code id} is extracted. - * All other fields are taken from the input DTO.

+ *

PS WebService requires XML request body even when {@code output_format=JSON} is set. + * The POST response JSON wraps multilingual fields in a different structure than GET + * responses, so the response body is discarded and a subsequent GET by reference is used + * to retrieve the created product with its id.

* - * @return the created product with its assigned PS {@code id} + * @return the created product with its assigned PS {@code id}, or {@code null} if not found after creation */ public PrestashopProductDto createProduct(PrestashopProductDto dto) { log.debug("Creating PrestaShop product reference={}", dto.reference()); - JsonNode response = restClient.post() + restClient.post() .uri(u -> u.path("/products") .queryParam("ws_key", wsKey) .queryParam("output_format", "JSON") @@ -106,17 +104,9 @@ public class PrestashopClient { .contentType(MediaType.APPLICATION_XML) .body(toProductXml(dto).getBytes(StandardCharsets.UTF_8)) .retrieve() - .body(JsonNode.class); + .toBodilessEntity(); - Integer psId = null; - if (response != null && response.has("product")) { - JsonNode product = response.get("product"); - if (product.has("id")) { - psId = product.get("id").asInt(); - } - } - return new PrestashopProductDto(psId, dto.reference(), dto.price(), dto.active(), - dto.idCategoryDefault(), dto.name(), dto.description(), dto.descriptionShort()); + return getProductByReference(dto.reference()).orElse(null); } /** Updates an existing product by its PrestaShop internal ID. */