From c1216da69c8fb6501887e6dc1714a810b2f21bc3 Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Wed, 30 Aug 2023 15:22:52 +0200 Subject: [PATCH] GH-1065 Fix Collection discovery in JsonMapper Resolves #1065 --- .../function/adapter/aws/AWSLambdaUtils.java | 1 - .../cloud/function/json/JsonMapper.java | 2 +- .../cloud/function/utils/JsonMapperTests.java | 25 +++++++++++++++++++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/main/java/org/springframework/cloud/function/adapter/aws/AWSLambdaUtils.java b/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/main/java/org/springframework/cloud/function/adapter/aws/AWSLambdaUtils.java index b58f5defa..0923e234b 100644 --- a/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/main/java/org/springframework/cloud/function/adapter/aws/AWSLambdaUtils.java +++ b/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/main/java/org/springframework/cloud/function/adapter/aws/AWSLambdaUtils.java @@ -179,7 +179,6 @@ public final class AWSLambdaUtils { } if (resultPayload != null) { - System.out.println(new String(resultPayload)); MessageBuilder messageBuilder = MessageBuilder.withPayload(resultPayload); if (lastMessage != null) { messageBuilder.copyHeaders(lastMessage.getHeaders()); diff --git a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/json/JsonMapper.java b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/json/JsonMapper.java index 0780e7893..8da030093 100644 --- a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/json/JsonMapper.java +++ b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/json/JsonMapper.java @@ -115,7 +115,7 @@ public abstract class JsonMapper { public static boolean isJsonStringRepresentsCollection(Object value) { boolean isJson = false; - if (value instanceof Iterable && !value.getClass().getPackage().getName().startsWith("reactor.util.function")) { + if (value instanceof Collection && !value.getClass().getPackage().getName().startsWith("reactor.util.function")) { return true; } if (value instanceof byte[]) { diff --git a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/utils/JsonMapperTests.java b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/utils/JsonMapperTests.java index 4be618a95..30207d367 100644 --- a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/utils/JsonMapperTests.java +++ b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/utils/JsonMapperTests.java @@ -20,7 +20,10 @@ import java.util.List; import java.util.stream.Stream; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import com.fasterxml.jackson.databind.node.ObjectNode; import com.google.gson.Gson; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; @@ -42,6 +45,28 @@ public class JsonMapperTests { return Stream.of(new GsonMapper(new Gson()), new JacksonMapper(new ObjectMapper())); } + @Test + public void objectNode_isJsonStringRepresentsCollection() { + ObjectNode node = JsonNodeFactory.instance.objectNode(); + node.put("id", "1234ab"); + node.put("foo", "bar"); + + /* + * Passing the ObjectNode directly results in a positive identification as + * a collection, as its distant parent JsonNode implements Iterable. + */ + assertThat(JsonMapper.isJsonStringRepresentsCollection(node)).isFalse(); + + String nodeAsString = node.toString(); + + /* + * Sending the node as a string returns false, however, as the line + * isJsonString(value) && str.startsWith("[") && str.endsWith("]") + * will not be true. + */ + assertThat(JsonMapper.isJsonStringRepresentsCollection(nodeAsString)).isFalse(); + } + @ParameterizedTest @MethodSource("params") public void vanillaArray(JsonMapper mapper) {