diff --git a/pom.xml b/pom.xml index ba2b87556..9a546433d 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,6 @@ spring-cloud-function-parent Spring Cloud Function Parent - 4.0.0-SNAPSHOT pom 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 72fb9181c..603701a74 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 @@ -193,7 +193,7 @@ final class AWSLambdaUtils { } String body = responseMessage == null - ? "\"OK\"" : new String(responseMessage.getPayload(), StandardCharsets.UTF_8).replaceAll("\\\"", ""); + ? "\"OK\"" : new String(responseMessage.getPayload(), StandardCharsets.UTF_8); response.put("body", body); if (responseMessage != null) { diff --git a/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/test/java/org/springframework/cloud/function/adapter/aws/FunctionInvokerTests.java b/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/test/java/org/springframework/cloud/function/adapter/aws/FunctionInvokerTests.java index 3b34e8b16..86aaf0d52 100644 --- a/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/test/java/org/springframework/cloud/function/adapter/aws/FunctionInvokerTests.java +++ b/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/test/java/org/springframework/cloud/function/adapter/aws/FunctionInvokerTests.java @@ -701,7 +701,7 @@ public class FunctionInvokerTests { invoker.handleRequest(targetStream, output, null); Map result = mapper.readValue(output.toByteArray(), Map.class); - assertThat(result.get("body")).isEqualTo("HELLO"); + assertThat(result.get("body")).isEqualTo("\"HELLO\""); System.clearProperty("spring.cloud.function.definition"); System.setProperty("spring.cloud.function.routing-expression", "'uppercase'"); @@ -711,7 +711,23 @@ public class FunctionInvokerTests { invoker.handleRequest(targetStream, output, null); result = this.mapper.readValue(output.toByteArray(), Map.class); - assertThat(result.get("body")).isEqualTo("HELLO"); + assertThat(result.get("body")).isEqualTo("\"HELLO\""); + } + + @SuppressWarnings("rawtypes") + @Test + public void testApiGatewayPojoReturninPojo() throws Exception { + System.setProperty("MAIN_CLASS", ApiGatewayConfiguration.class.getName()); + System.setProperty("spring.cloud.function.definition", "uppercasePojoReurnPojo"); + FunctionInvoker invoker = new FunctionInvoker(); + + InputStream targetStream = new ByteArrayInputStream(this.apiGatewayEventWithStructuredBody.getBytes()); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + invoker.handleRequest(targetStream, output, null); + + Map response = mapper.readValue(output.toByteArray(), Map.class); + Person person = mapper.readValue((String) response.get("body"), Person.class); + assertThat(person.getName()).isEqualTo("JIM LAHEY"); } @SuppressWarnings("rawtypes") @@ -726,7 +742,7 @@ public class FunctionInvokerTests { invoker.handleRequest(targetStream, output, null); Map result = mapper.readValue(output.toByteArray(), Map.class); - assertThat(result.get("body")).isEqualTo("JIM LAHEY"); + assertThat(result.get("body")).isEqualTo("\"JIM LAHEY\""); System.clearProperty("spring.cloud.function.definition"); System.setProperty("spring.cloud.function.routing-expression", "'uppercasePojo'"); @@ -736,7 +752,7 @@ public class FunctionInvokerTests { invoker.handleRequest(targetStream, output, null); result = this.mapper.readValue(output.toByteArray(), Map.class); - assertThat(result.get("body")).isEqualTo("JIM LAHEY"); + assertThat(result.get("body")).isEqualTo("\"JIM LAHEY\""); } @SuppressWarnings("rawtypes") @@ -752,7 +768,7 @@ public class FunctionInvokerTests { Map result = mapper.readValue(output.toByteArray(), Map.class); System.out.println(result); - assertThat(result.get("body")).isEqualTo("hello"); + assertThat(result.get("body")).isEqualTo("\"hello\""); System.clearProperty("spring.cloud.function.definition"); System.setProperty("spring.cloud.function.routing-expression", "'inputApiEvent'"); @@ -762,7 +778,7 @@ public class FunctionInvokerTests { invoker.handleRequest(targetStream, output, null); result = this.mapper.readValue(output.toByteArray(), Map.class); - assertThat(result.get("body")).isEqualTo("hello"); + assertThat(result.get("body")).isEqualTo("\"hello\""); } @SuppressWarnings("rawtypes") @@ -778,7 +794,7 @@ public class FunctionInvokerTests { Map result = mapper.readValue(output.toByteArray(), Map.class); System.out.println(result); - assertThat(result.get("body")).isEqualTo("Hello from Lambda"); + assertThat(result.get("body")).isEqualTo("\"Hello from Lambda\""); System.clearProperty("spring.cloud.function.definition"); System.setProperty("spring.cloud.function.routing-expression", "'inputApiV2Event'"); @@ -788,7 +804,7 @@ public class FunctionInvokerTests { invoker.handleRequest(targetStream, output, null); result = this.mapper.readValue(output.toByteArray(), Map.class); - assertThat(result.get("body")).isEqualTo("Hello from Lambda"); + assertThat(result.get("body")).isEqualTo("\"Hello from Lambda\""); } @SuppressWarnings("rawtypes") @@ -804,7 +820,7 @@ public class FunctionInvokerTests { Map result = mapper.readValue(output.toByteArray(), Map.class); System.out.println(result); - assertThat(result.get("body")).isEqualTo("boom"); + assertThat(result.get("body")).isEqualTo("\"boom\""); } @SuppressWarnings("rawtypes") @@ -874,7 +890,7 @@ public class FunctionInvokerTests { Map result = mapper.readValue(output.toByteArray(), Map.class); System.out.println(result); - assertThat(result.get("body")).isEqualTo("hello"); + assertThat(result.get("body")).isEqualTo("\"hello\""); } @SuppressWarnings("rawtypes") @@ -890,7 +906,7 @@ public class FunctionInvokerTests { Map result = mapper.readValue(output.toByteArray(), Map.class); System.out.println(result); - assertThat(result.get("body")).isEqualTo("hello"); + assertThat(result.get("body")).isEqualTo("\"hello\""); } @SuppressWarnings("rawtypes") @@ -937,7 +953,7 @@ public class FunctionInvokerTests { invoker.handleRequest(targetStream, output, null); Map result = mapper.readValue(output.toByteArray(), Map.class); - assertThat(result.get("body")).isEqualTo("olleh"); + assertThat(result.get("body")).isEqualTo("\"olleh\""); } @SuppressWarnings("rawtypes") @@ -953,7 +969,7 @@ public class FunctionInvokerTests { invoker.handleRequest(targetStream, output, null); Map result = mapper.readValue(output.toByteArray(), Map.class); - assertThat(result.get("body")).isEqualTo("OLLEH"); + assertThat(result.get("body")).isEqualTo("\"OLLEH\""); } @SuppressWarnings("unchecked") @@ -1179,6 +1195,15 @@ public class FunctionInvokerTests { }; } + @Bean + public Function uppercasePojoReurnPojo() { + return v -> { + Person p = new Person(); + p.setName(v.getName().toUpperCase()); + return p; + }; + } + @Bean public Function inputApiEvent() { return v -> {