首页 > 解决方案 > 配置 Java AWS Lambda 使用的 Objectmapper

问题描述

我正在尝试开发一个由 SQS 事件触发的 AWS Lambda 函数。

我正在使用spring-cloud-function-adapter-aws(版本 1.0.0.RELEASE),特别是SpringBootRequestHandler

但是,正在使用的 ObjectMapper 区分大小写,因此无法成功转换来自 SQS 的 Json。

SQS 发布以下 Json,尤其是我遇到问题的Records字段。

    {
  "Records": [
    {
      "body": "Hello from SQS!",
      "receiptHandle": "MessageReceiptHandle",
      "md5OfBody": "7b270e59b47ff90a553787216d55d91d",
      "eventSourceARN": "arn:aws:sqs:eu-west-1:123456789012:MyQueue",
      "eventSource": "aws:sqs",
      "awsRegion": "eu-west-1",
      "messageId": "19dd0b57-b21e-4ac1-bd88-01bbb068cb78",
      "attributes": {
        "ApproximateFirstReceiveTimestamp": "1523232000001",
        "SenderId": "123456789012",
        "ApproximateReceiveCount": "1",
        "SentTimestamp": "1523232000000"
      },
      "messageAttributes": {}
    }
  ]
}

我已经尝试过this question中的建议,但无济于事。在 Spring 中配置 ObjectMapper

在我的 POJO 中,我还添加了以下注释,但它在 Lambda 之外也不起作用。

@JsonProperty("Records")
private List<SqsRecord> Records;

任何帮助将非常感激。

我的 Lambda 处理程序定义为:

public class SqsEventHandler extends SpringBootRequestHandler<SqsEvent, String> {}

POJO定义为:

public class SqsEvent {

@JsonProperty("Records")
private List<SqsRecord> records;

@Data
public class SqsRecord {
    private String body;
    private String receiptHandle;
    private String md5OfBody;
    private String eventSourceARN;
    private String eventSource;
    private String awsRegion;
    private String messageId;
}

}

我希望 ObjectMapper 能够读取示例消息中的 Json,但“记录”字段为空。

标签: javaspring-bootaws-lambdaamazon-sqs

解决方案


我以更简单的方式解决了这个问题。

参考https://docs.aws.amazon.com/lambda/latest/dg/java-handler-io-type-stream.html和具体

如果 Lambda 的序列化方式不能满足你的需求,可以使用字节流实现

我现在直接使用 SpringBootStreamHandler,并且在我的 Spring Configuration 类中创建了一个 ObjectMapper 实例,其中包含我所需的配置选项:

@Bean
public ObjectMapper objectMapper() {
    final ObjectMapper mapper = new ObjectMapper();
    mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    return mapper;
}

推荐阅读