Estoy tratando de desarrollar una función de AWS Lambda que se desencadena por eventos de SQS.
Estoy utilizando el resorte de nube de función adaptador-AWS (versión 1.0.0.RELEASE) y en concreto un SpringBootRequestHandler .
Sin embargo, el ObjectMapper que se utiliza es sensible a mayúsculas y por lo tanto no permite convertir con éxito el JSON procedentes de SQS.
SQS publica el siguiente JSON y es el Records campo en particular que estoy teniendo el problema.
{
"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": {}
}
]
}
He todas las sugerencias de esta pregunta, pero fue en vano. Configuración ObjectMapper en la primavera
En mi POJO, También he añadido el siguiente anotación, pero no está funcionando bien, mientras que lo haría fuera de Lambda.
@JsonProperty("Records")
private List<SqsRecord> Records;
Cualquier ayuda sería muy apreciada.
Mi manejador de Lambda se define como:
public class SqsEventHandler extends SpringBootRequestHandler<SqsEvent, String> {}
El POJO define como:
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;
}
}
Espero que el JSON del mensaje de muestra para poder ser leído en el ObjectMapper, pero el campo "registros" es nulo.
Tengo este problema resuelto de una manera más sencilla.
Referenciación https://docs.aws.amazon.com/lambda/latest/dg/java-handler-io-type-stream.html y en concreto
Si el enfoque de serialización de Lambda no satisface sus necesidades, puede utilizar la implementación de flujo de bytes
Ahora estoy usando la SpringBootStreamHandler directamente y he creado una instancia ObjectMapper con mis opciones de configuración requeridos en mi clase de configuración de la primavera como:
@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;
}