From 579d50b131c138c87d6bd0a3f76b581b069e936b Mon Sep 17 00:00:00 2001 From: Francisco Guemes Date: Thu, 1 Oct 2026 23:47:44 +0300 Subject: [PATCH 1/2] Handle unknown payment recommendation options gracefully --- .../types/CustomerRecommendationsPayload.java | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/braintreegateway/graphql/types/CustomerRecommendationsPayload.java b/src/main/java/com/braintreegateway/graphql/types/CustomerRecommendationsPayload.java index e19a2db5..49a319b9 100644 --- a/src/main/java/com/braintreegateway/graphql/types/CustomerRecommendationsPayload.java +++ b/src/main/java/com/braintreegateway/graphql/types/CustomerRecommendationsPayload.java @@ -2,6 +2,9 @@ import java.util.List; import java.util.Map; +import java.util.Objects; +import java.util.logging.Level; +import java.util.logging.Logger; import java.util.stream.Collectors; import com.braintreegateway.exceptions.ServerException; @@ -15,6 +18,8 @@ */ @Experimental("This class is experimental and may change in future releases.") public class CustomerRecommendationsPayload { + private static final Logger LOGGER = Logger.getLogger("Braintree"); + private final String sessionId; private final boolean isInPayPalNetwork; private final CustomerRecommendations recommendations; @@ -47,10 +52,13 @@ private static CustomerRecommendations extractRecommendations(Map { Integer recommendedPriority = getValue(recommendationObj, "recommendedPriority"); String paymentOptionString = getValue(recommendationObj, "paymentOption"); - RecommendedPaymentOption paymentOption = RecommendedPaymentOption - .valueOf(paymentOptionString); + RecommendedPaymentOption paymentOption = parsePaymentOption(paymentOptionString); + if (paymentOption == null) { + return null; + } return new PaymentRecommendation(paymentOption, recommendedPriority); }) + .filter(Objects::nonNull) .collect(Collectors.toList()); return new CustomerRecommendations(paymentRecommendationList); @@ -59,6 +67,20 @@ private static CustomerRecommendations extractRecommendations(Map T getValue(Map response, String key) { Map map = response; String[] keyParts = key.split("\\."); From 97459a0d8033ba175c3e24f0648321d92ae5b9ac Mon Sep 17 00:00:00 2001 From: Francisco Guemes Date: Fri, 2 Oct 2026 00:17:13 +0300 Subject: [PATCH 2/2] Refactor payment recommendation parsing to handle missing options gracefully --- .../types/CustomerRecommendationsPayload.java | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/braintreegateway/graphql/types/CustomerRecommendationsPayload.java b/src/main/java/com/braintreegateway/graphql/types/CustomerRecommendationsPayload.java index 49a319b9..26ed50e1 100644 --- a/src/main/java/com/braintreegateway/graphql/types/CustomerRecommendationsPayload.java +++ b/src/main/java/com/braintreegateway/graphql/types/CustomerRecommendationsPayload.java @@ -49,15 +49,7 @@ private static CustomerRecommendations extractRecommendations(Map paymentRecommendationList = paymentRecommendations.stream() - .map(recommendationObj -> { - Integer recommendedPriority = getValue(recommendationObj, "recommendedPriority"); - String paymentOptionString = getValue(recommendationObj, "paymentOption"); - RecommendedPaymentOption paymentOption = parsePaymentOption(paymentOptionString); - if (paymentOption == null) { - return null; - } - return new PaymentRecommendation(paymentOption, recommendedPriority); - }) + .map(CustomerRecommendationsPayload::parsePaymentRecommendation) .filter(Objects::nonNull) .collect(Collectors.toList()); @@ -67,6 +59,21 @@ private static CustomerRecommendations extractRecommendations(Map recommendationObj) { + if (recommendationObj == null || !recommendationObj.containsKey("paymentOption")) { + LOGGER.log(Level.WARNING, "Skipping payment recommendation with missing payment option"); + return null; + } + RecommendedPaymentOption paymentOption = parsePaymentOption(getValue(recommendationObj, "paymentOption")); + if (paymentOption == null) { + return null; + } + Integer recommendedPriority = recommendationObj.containsKey("recommendedPriority") + ? (Integer) recommendationObj.get("recommendedPriority") + : null; + return new PaymentRecommendation(paymentOption, recommendedPriority); + } + private static RecommendedPaymentOption parsePaymentOption(String paymentOptionString) { if (paymentOptionString == null || paymentOptionString.trim().isEmpty()) { LOGGER.log(Level.WARNING, "Skipping payment recommendation with missing payment option");