GH-722 Fix support for API Gateway v2 when Function signature is POJO
Resolves #722
This commit is contained in:
@@ -120,25 +120,21 @@ final class AWSLambdaUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (request instanceof Map) {
|
if (request instanceof Map) {
|
||||||
|
logger.info("Incoming MAP: " + request);
|
||||||
if (((Map) request).containsKey("httpMethod")) { //API Gateway
|
if (((Map) request).containsKey("httpMethod")) { //API Gateway
|
||||||
|
logger.info("Incoming request is API Gateway");
|
||||||
boolean mapInputType = (inputType instanceof ParameterizedType && ((Class<?>) ((ParameterizedType) inputType).getRawType()).isAssignableFrom(Map.class));
|
boolean mapInputType = (inputType instanceof ParameterizedType && ((Class<?>) ((ParameterizedType) inputType).getRawType()).isAssignableFrom(Map.class));
|
||||||
if (mapInputType) {
|
if (mapInputType) {
|
||||||
messageBuilder = MessageBuilder.withPayload(request).setHeader("httpMethod", ((Map) request).get("httpMethod"));
|
messageBuilder = MessageBuilder.withPayload(request).setHeader("httpMethod", ((Map) request).get("httpMethod"));
|
||||||
|
messageBuilder.setHeader(AWS_API_GATEWAY, true);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Object body = ((Map) request).remove("body");
|
messageBuilder = createMessageBuilderForPOJOFunction(objectMapper, (Map) request);
|
||||||
try {
|
|
||||||
body = body instanceof String
|
|
||||||
? String.valueOf(body).getBytes(StandardCharsets.UTF_8)
|
|
||||||
: objectMapper.writeValueAsBytes(body);
|
|
||||||
}
|
|
||||||
catch (Exception e) {
|
|
||||||
throw new IllegalStateException(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
messageBuilder = MessageBuilder.withPayload(body).copyHeaders(((Map) request));
|
|
||||||
}
|
}
|
||||||
messageBuilder.setHeader(AWS_API_GATEWAY, true);
|
}
|
||||||
|
else if ((((Map) request).containsKey("routeKey") && ((Map) request).containsKey("version"))) {
|
||||||
|
logger.info("Incoming request is API Gateway v2.0");
|
||||||
|
messageBuilder = createMessageBuilderForPOJOFunction(objectMapper, (Map) request);
|
||||||
}
|
}
|
||||||
Object providedHeaders = ((Map) request).remove("headers");
|
Object providedHeaders = ((Map) request).remove("headers");
|
||||||
if (providedHeaders != null && providedHeaders instanceof Map) {
|
if (providedHeaders != null && providedHeaders instanceof Map) {
|
||||||
@@ -163,6 +159,24 @@ final class AWSLambdaUtils {
|
|||||||
return messageBuilder.copyHeaders(headers).build();
|
return messageBuilder.copyHeaders(headers).build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings({ "rawtypes", "unchecked" })
|
||||||
|
private static MessageBuilder createMessageBuilderForPOJOFunction(ObjectMapper objectMapper, Map request) {
|
||||||
|
Object body = request.remove("body");
|
||||||
|
try {
|
||||||
|
body = body instanceof String
|
||||||
|
? String.valueOf(body).getBytes(StandardCharsets.UTF_8)
|
||||||
|
: objectMapper.writeValueAsBytes(body);
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
throw new IllegalStateException(e);
|
||||||
|
}
|
||||||
|
logger.info("Body is " + body);
|
||||||
|
|
||||||
|
MessageBuilder messageBuilder = MessageBuilder.withPayload(body).copyHeaders(request);
|
||||||
|
messageBuilder.setHeader(AWS_API_GATEWAY, true);
|
||||||
|
return messageBuilder;
|
||||||
|
}
|
||||||
|
|
||||||
@SuppressWarnings({ "rawtypes", "unchecked" })
|
@SuppressWarnings({ "rawtypes", "unchecked" })
|
||||||
public static byte[] generateOutput(Message requestMessage, Message<byte[]> responseMessage,
|
public static byte[] generateOutput(Message requestMessage, Message<byte[]> responseMessage,
|
||||||
ObjectMapper objectMapper, Type functionOutputType) {
|
ObjectMapper objectMapper, Type functionOutputType) {
|
||||||
|
|||||||
Reference in New Issue
Block a user