From 4b8a45c6546e7a051916784e47bf7a0647b2842f Mon Sep 17 00:00:00 2001 From: Twometer Date: Wed, 20 Apr 2022 11:44:58 +0200 Subject: [PATCH] Fix ClassCastException with Spring Native Resolves #860 --- .../function/adapter/aws/AWSLambdaUtils.java | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 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 18e9c7d4d..87e556f27 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 @@ -161,10 +161,21 @@ final class AWSLambdaUtils { return messageBuilder; } + private static byte[] extractPayload(Message msg, JsonMapper objectMapper) { + if (msg.getPayload() instanceof byte[]) { + return (byte[]) msg.getPayload(); + } + else { + return objectMapper.toJson(msg.getPayload()); + } + } + @SuppressWarnings({ "rawtypes", "unchecked" }) - public static byte[] generateOutput(Message requestMessage, Message responseMessage, + public static byte[] generateOutput(Message requestMessage, Message responseMessage, JsonMapper objectMapper, Type functionOutputType) { + byte[] payload = extractPayload((Message) responseMessage, objectMapper); + Class outputClass = FunctionTypeUtils.getRawType(functionOutputType); if (outputClass != null) { String outputClassName = outputClass.getName(); @@ -172,11 +183,11 @@ final class AWSLambdaUtils { outputClassName.equals("com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent") || outputClassName.equals("com.amazonaws.services.lambda.runtime.events.ApplicationLoadBalancerResponseEvent") || outputClassName.equals("com.amazonaws.services.lambda.runtime.events.IamPolicyResponse")) { - return responseMessage.getPayload(); + return payload; } } - byte[] responseBytes = responseMessage == null ? "\"OK\"".getBytes() : responseMessage.getPayload(); + byte[] responseBytes = responseMessage == null ? "\"OK\"".getBytes() : payload; if (requestMessage.getHeaders().containsKey(AWS_API_GATEWAY) && ((boolean) requestMessage.getHeaders().get(AWS_API_GATEWAY))) { Map response = new HashMap(); response.put("isBase64Encoded", false); @@ -197,7 +208,7 @@ final class AWSLambdaUtils { } String body = responseMessage == null - ? "\"OK\"" : new String(responseMessage.getPayload(), StandardCharsets.UTF_8); + ? "\"OK\"" : new String(payload, StandardCharsets.UTF_8); response.put("body", body); if (responseMessage != null) {