Проблема десериализации объекта, извлеченного из SQS с использованием GSON - PullRequest
0 голосов
/ 29 марта 2020

У меня есть лямбда-функция, которая получает объект S3Event, когда файл помещается в S3 Bucket. Когда лямбда не работает, она переходит в очередь недоставленных писем, настроенную в Amazon SQS.

Когда я извлекаю эти сообщения, это тело:

{
"Records": [
    {
        "eventVersion": "2.1",
        "eventSource": "aws:s3",
        "awsRegion": "us-east-1",
        "eventTime": "d",
        "eventName": "d:Put",
        "userIdentity": {
            "principalId": ""
        },
        "requestParameters": {
            "sourceIPAddress": "2"
        },
        "responseElements": {
            "x-amz-request-id": "",
            "x-amz-id-2": "g"
        },
        "s3": {
            "s3SchemaVersion": "1.0",
            "configurationId": "",
            "bucket": {
                "name": "",
                "ownerIdentity": {
                    "principalId": ""
                },
                "arn": ""
            },
            "object": {
                "key": "",
                "size": 12502,
                "eTag": "",
                "sequencer": ""
            }
        }
    }
]

}

Это немного похоже на объект S3Event, который содержит список записей S3EventNotification. Я попытался десериализовать его в объект события S3, используя следующее:

S3Event event = new GsonBuilder().serializeNulls().create().fromJson(s3EventString, S3Event.class);

Это приводит к нулевому объекту, например так:

{"records":null}

Я заметил в возвращении json из SQS буква «R» в записях пишется с большой буквы. Я не был уверен, что это имело значение, поэтому я изменил его на строчную букву "r", и это выдает эту ошибку:

java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING

Я действительно не уверен, что это за тип объекта на самом деле.

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 30 марта 2020

Странно. С Джексоном это работает отлично, поэтому я буду использовать это сейчас ..

import com.fasterxml.jackson.databind.ObjectMapper;
import com.amazonaws.services.sqs.model.Message;

private S3Event extractS3Event(Message message){
     ObjectMapper objectMapper = new ObjectMapper();
     return objectMapper.readValue(message.getBody(), S3Event.class)
}

//Then to get the S3 Details

S3Event event = extractS3Event(message);
S3Entity entity = event.getRecords().get(0).getS3();
String bucketName = entity.getBucket().getName();
String s3Key = entity.getObject().getKey();
...