micronaut-projects / micronaut-aws

Projects specific to integrating Micronaut and Amazon Web Services (AWS)
Apache License 2.0
82 stars 81 forks source link

S3 lambda events can't be deserialized (and therefore tutorial fails) #2048

Closed brucej72 closed 3 months ago

brucej72 commented 4 months ago

Expected Behavior

The tutorial here: https://guides.micronaut.io/latest/micronaut-aws-lambda-s3-event-maven-java.html ...should be able to be followed and run without error.

Note this issue looks like it was explored in #1941 but this does not appear to be fixed.

Actual Behaviour

The function handler is called, but throws an exception:

An error occurred during JSON parsing: java.lang.RuntimeException java.lang.RuntimeException: An error occurred during JSON parsing Caused by: io.micronaut.core.beans.exceptions.IntrospectionException: No deserializable introspection present for type: ResponseElementsEntity responseElements. Consider adding Serdeable.Deserializable annotate to type ResponseElementsEntity responseElements. Alternatively if you are not in control of the project's source code, you can use @SerdeImport(ResponseElementsEntity.class) to enable deserialization of this type. at io.micronaut.serde.support.DefaultSerdeIntrospections.resolveIntrospectionForDeserialization(DefaultSerdeIntrospections.java:196) at io.micronaut.serde.support.DefaultSerdeIntrospections.getDeserializableIntrospection(DefaultSerdeIntrospections.java:160) at io.micronaut.serde.support.deserializers.ObjectDeserializer.createDeserBean(ObjectDeserializer.java:133) at io.micronaut.serde.support.deserializers.ObjectDeserializer.lambda$getDeserializableBean$1(ObjectDeserializer.java:123) at io.micronaut.core.util.SupplierUtil$2.get(SupplierUtil.java:79) at io.micronaut.serde.support.deserializers.ObjectDeserializer.getDeserializableBean(ObjectDeserializer.java:124) at io.micronaut.serde.support.deserializers.ObjectDeserializer.createSpecific(ObjectDeserializer.java:69) at io.micronaut.serde.support.deserializers.DeserBean.findDeserializer(DeserBean.java:592) at io.micronaut.serde.support.deserializers.DeserBean.initProperty(DeserBean.java:476) at io.micronaut.serde.support.deserializers.DeserBean.initializeInternal(DeserBean.java:432) at io.micronaut.serde.support.deserializers.DeserBean.initialize(DeserBean.java:412) at io.micronaut.serde.support.deserializers.ObjectDeserializer.getDeserializableBean(ObjectDeserializer.java:125) at io.micronaut.serde.support.deserializers.ObjectDeserializer.createSpecific(ObjectDeserializer.java:69) at io.micronaut.serde.support.deserializers.collect.CoreCollectionsDeserializers$SpecificOnlyCollectionDeserializer.createSpecific(CoreCollectionsDeserializers.java:334) at io.micronaut.serde.support.deserializers.DeserBean.findDeserializer(DeserBean.java:592) at io.micronaut.serde.support.deserializers.DeserBean.initProperty(DeserBean.java:476) at io.micronaut.serde.support.deserializers.DeserBean.initializeInternal(DeserBean.java:432) at io.micronaut.serde.support.deserializers.DeserBean.initialize(DeserBean.java:412) at io.micronaut.serde.support.deserializers.ObjectDeserializer.getDeserializableBean(ObjectDeserializer.java:125) at io.micronaut.serde.support.deserializers.ObjectDeserializer.createSpecific(ObjectDeserializer.java:69) at io.micronaut.serde.jackson.JacksonJsonMapper.readValue0(JacksonJsonMapper.java:175) at io.micronaut.serde.jackson.JacksonJsonMapper.readValue(JacksonJsonMapper.java:169) at io.micronaut.serde.jackson.JacksonJsonMapper.readValue(JacksonJsonMapper.java:206) at io.micronaut.function.aws.JsonMapperCustomPojoSerializer.fromJson(JsonMapperCustomPojoSerializer.java:70)

Steps To Reproduce

Using mn 4.2.4 (as per the tutorial) or 4.3.0 installed using sdk.

  1. Follow the tutorial linked above (you don't need to actually implement the thumbnail generator, just implement a trivial handler such as:
@Serdeable
public class FunctionRequestHandler extends MicronautRequestHandler<S3EventNotification, Void> {

    private static final Logger LOG = LoggerFactory.getLogger(FunctionRequestHandler.class);

    @Inject
    JsonMapper objectMapper;

    @Inject
    public S3Client s3;

    @Override
    public Void execute(S3EventNotification input) {

        for (S3EventNotification.S3EventNotificationRecord record : input.getRecords()) {

            LOG.info("event name: {}", record.getEventName());

        }

        return null;
    }
}
  1. Copy a file into the S3 bucket you have set up with the lambda event handler
  2. Look at the Cloudwatch logs

Environment Information

MacOS 14.3 java 17.0.8 2023-07-18 LTS mn 4.2.4 or 4.3.0

Example Application

No response

Version

4.2.4 or 4.3.0

sdelamo commented 3 months ago

Thanks for reporting @brucej72 We have an issue which we are currently investigating:

https://github.com/micronaut-projects/micronaut-aws/pull/2079

A workaround is to use Micronaut Jackson Databind.

I wrote a CDK sample to test this https://github.com/sdelamo/micronaut-aws-lambda-s3-cdk