From 4a4088cb677a835bdfb117a8fbfc46d011bc66ca Mon Sep 17 00:00:00 2001 From: Davide Melfi Date: Thu, 19 Mar 2026 14:44:45 +0000 Subject: [PATCH 01/10] chore: reverted the poms --- aws-lambda-java-runtime-interface-client/pom.xml | 4 ++-- .../test/integration/test-handler/pom.xml | 2 +- aws-lambda-java-tests/pom.xml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/aws-lambda-java-runtime-interface-client/pom.xml b/aws-lambda-java-runtime-interface-client/pom.xml index be59e61ce..ab7166c84 100644 --- a/aws-lambda-java-runtime-interface-client/pom.xml +++ b/aws-lambda-java-runtime-interface-client/pom.xml @@ -4,7 +4,7 @@ 4.0.0 com.amazonaws aws-lambda-java-runtime-interface-client - 2.10.0 + 2.9.0 jar AWS Lambda Java Runtime Interface Client @@ -66,7 +66,7 @@ com.amazonaws aws-lambda-java-serialization - 1.3.0 + 1.2.0 software.amazon.awssdk diff --git a/aws-lambda-java-runtime-interface-client/test/integration/test-handler/pom.xml b/aws-lambda-java-runtime-interface-client/test/integration/test-handler/pom.xml index 862e861d8..e854831e7 100644 --- a/aws-lambda-java-runtime-interface-client/test/integration/test-handler/pom.xml +++ b/aws-lambda-java-runtime-interface-client/test/integration/test-handler/pom.xml @@ -15,7 +15,7 @@ com.amazonaws aws-lambda-java-runtime-interface-client - 2.10.0 + 2.8.7 diff --git a/aws-lambda-java-tests/pom.xml b/aws-lambda-java-tests/pom.xml index 5c509148a..314669968 100644 --- a/aws-lambda-java-tests/pom.xml +++ b/aws-lambda-java-tests/pom.xml @@ -40,7 +40,7 @@ com.amazonaws aws-lambda-java-serialization - 1.3.0 + 1.1.6 com.amazonaws From 871434866f7eecb6c372d1bc15b381832427ef13 Mon Sep 17 00:00:00 2001 From: Davide Melfi Date: Thu, 19 Mar 2026 14:47:59 +0000 Subject: [PATCH 02/10] chore: upgrading the poms --- aws-lambda-java-runtime-interface-client/pom.xml | 2 +- .../test/integration/test-handler/pom.xml | 2 +- aws-lambda-java-tests/pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/aws-lambda-java-runtime-interface-client/pom.xml b/aws-lambda-java-runtime-interface-client/pom.xml index ab7166c84..65304c61a 100644 --- a/aws-lambda-java-runtime-interface-client/pom.xml +++ b/aws-lambda-java-runtime-interface-client/pom.xml @@ -4,7 +4,7 @@ 4.0.0 com.amazonaws aws-lambda-java-runtime-interface-client - 2.9.0 + 2.10.1 jar AWS Lambda Java Runtime Interface Client diff --git a/aws-lambda-java-runtime-interface-client/test/integration/test-handler/pom.xml b/aws-lambda-java-runtime-interface-client/test/integration/test-handler/pom.xml index e854831e7..64893528b 100644 --- a/aws-lambda-java-runtime-interface-client/test/integration/test-handler/pom.xml +++ b/aws-lambda-java-runtime-interface-client/test/integration/test-handler/pom.xml @@ -15,7 +15,7 @@ com.amazonaws aws-lambda-java-runtime-interface-client - 2.8.7 + 2.10.1 diff --git a/aws-lambda-java-tests/pom.xml b/aws-lambda-java-tests/pom.xml index 314669968..1ff76a76e 100644 --- a/aws-lambda-java-tests/pom.xml +++ b/aws-lambda-java-tests/pom.xml @@ -40,7 +40,7 @@ com.amazonaws aws-lambda-java-serialization - 1.1.6 + 1.2.0 com.amazonaws From 1fe801abf270d7def8088055ad191e80b4acb68c Mon Sep 17 00:00:00 2001 From: Davide Melfi Date: Thu, 19 Mar 2026 14:54:17 +0000 Subject: [PATCH 03/10] chore: update docs --- README.md | 2 +- aws-lambda-java-runtime-interface-client/README.md | 4 ++-- aws-lambda-java-runtime-interface-client/RELEASE.CHANGELOG.md | 4 ++++ 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index e00d99a60..580e14e41 100644 --- a/README.md +++ b/README.md @@ -163,7 +163,7 @@ The purpose of this package is to allow developers to deploy their applications com.amazonaws aws-lambda-java-runtime-interface-client - 2.10.0 + 2.10.1 ``` diff --git a/aws-lambda-java-runtime-interface-client/README.md b/aws-lambda-java-runtime-interface-client/README.md index ad159c194..c448e7a89 100644 --- a/aws-lambda-java-runtime-interface-client/README.md +++ b/aws-lambda-java-runtime-interface-client/README.md @@ -70,7 +70,7 @@ pom.xml com.amazonaws aws-lambda-java-runtime-interface-client - 2.10.0 + 2.10.1 @@ -203,7 +203,7 @@ platform-specific JAR by setting the ``. com.amazonaws aws-lambda-java-runtime-interface-client - 2.10.0 + 2.10.1 linux-x86_64 ``` diff --git a/aws-lambda-java-runtime-interface-client/RELEASE.CHANGELOG.md b/aws-lambda-java-runtime-interface-client/RELEASE.CHANGELOG.md index 76612e684..94a8a8057 100644 --- a/aws-lambda-java-runtime-interface-client/RELEASE.CHANGELOG.md +++ b/aws-lambda-java-runtime-interface-client/RELEASE.CHANGELOG.md @@ -1,3 +1,7 @@ +### March 19, 2026 +`2.10.1` +- Revert aws-lambda-java-serialization dependency to 1.2.0 + ### March 12, 2026 `2.10.0` - Update aws-lambda-java-serialization dependency to 1.3.0 From cf0f296b66847fa6592994b73359aff342eae161 Mon Sep 17 00:00:00 2001 From: Davide Melfi Date: Thu, 19 Mar 2026 15:07:38 +0000 Subject: [PATCH 04/10] chore: add targets to tests --- .github/workflows/aws-lambda-java-tests.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/aws-lambda-java-tests.yml b/.github/workflows/aws-lambda-java-tests.yml index 720c52c11..1f7a772e4 100644 --- a/.github/workflows/aws-lambda-java-tests.yml +++ b/.github/workflows/aws-lambda-java-tests.yml @@ -8,10 +8,16 @@ on: branches: [ main ] paths: - 'aws-lambda-java-tests/**' + - 'aws-lambda-java-runtime-interface-client/**' + - 'aws-lambda-java-serialization/**' + - 'aws-lambda-java-events/**' pull_request: branches: [ '*' ] paths: - 'aws-lambda-java-tests/**' + - 'aws-lambda-java-runtime-interface-client/**' + - 'aws-lambda-java-serialization/**' + - 'aws-lambda-java-events/**' - '.github/workflows/aws-lambda-java-tests.yml' permissions: From 890d56247fce77becee9f41b81c80f67a5b43651 Mon Sep 17 00:00:00 2001 From: Davide Melfi Date: Thu, 19 Mar 2026 15:24:40 +0000 Subject: [PATCH 05/10] chore: add workflow_dispatch --- .github/workflows/aws-lambda-java-tests.yml | 1 + aws-lambda-java-serialization/mise.toml | 2 ++ 2 files changed, 3 insertions(+) create mode 100644 aws-lambda-java-serialization/mise.toml diff --git a/.github/workflows/aws-lambda-java-tests.yml b/.github/workflows/aws-lambda-java-tests.yml index 1f7a772e4..363647cc4 100644 --- a/.github/workflows/aws-lambda-java-tests.yml +++ b/.github/workflows/aws-lambda-java-tests.yml @@ -4,6 +4,7 @@ name: Java CI aws-lambda-java-tests on: + workflow_dispatch: push: branches: [ main ] paths: diff --git a/aws-lambda-java-serialization/mise.toml b/aws-lambda-java-serialization/mise.toml new file mode 100644 index 000000000..854b93b56 --- /dev/null +++ b/aws-lambda-java-serialization/mise.toml @@ -0,0 +1,2 @@ +[tools] +java = "corretto-8" From 51760791eaa8d03bcf3f997bcfa678f78d11bec5 Mon Sep 17 00:00:00 2001 From: Davide Melfi Date: Thu, 19 Mar 2026 15:27:09 +0000 Subject: [PATCH 06/10] chore: add comment to trigger testing --- aws-lambda-java-tests/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/aws-lambda-java-tests/pom.xml b/aws-lambda-java-tests/pom.xml index 1ff76a76e..11f3da00b 100644 --- a/aws-lambda-java-tests/pom.xml +++ b/aws-lambda-java-tests/pom.xml @@ -1,3 +1,4 @@ + 4.0.0 From 1d6420ebff845cc8c9924bac782f7e0b58482ae1 Mon Sep 17 00:00:00 2001 From: Davide Melfi Date: Thu, 19 Mar 2026 15:38:58 +0000 Subject: [PATCH 07/10] chore: downgrade jackson library --- .../RELEASE.CHANGELOG.md | 5 + aws-lambda-java-serialization/pom.xml | 4 +- .../events/LambdaEventSerializers.java | 524 +++++++++--------- .../JodaDateTimeDeserializationTest.java | 63 +++ 4 files changed, 344 insertions(+), 252 deletions(-) create mode 100644 aws-lambda-java-tests/src/test/java/com/amazonaws/services/lambda/runtime/tests/JodaDateTimeDeserializationTest.java diff --git a/aws-lambda-java-serialization/RELEASE.CHANGELOG.md b/aws-lambda-java-serialization/RELEASE.CHANGELOG.md index 59ed3c8cb..b2c3e739d 100644 --- a/aws-lambda-java-serialization/RELEASE.CHANGELOG.md +++ b/aws-lambda-java-serialization/RELEASE.CHANGELOG.md @@ -1,3 +1,8 @@ +### March 19, 2026 +`1.2.1`: +- Revert `jackson-databind` dependency from 2.18.6 to 2.15.4 +- Revert `PropertyNamingStrategies.UpperCamelCaseStrategy` to `PropertyNamingStrategy.PascalCaseStrategy` + ### March 11, 2026 `1.3.0`: - Update `jackson-databind` dependency from 2.15.4 to 2.18.6 diff --git a/aws-lambda-java-serialization/pom.xml b/aws-lambda-java-serialization/pom.xml index 93c27d879..8ed303e29 100644 --- a/aws-lambda-java-serialization/pom.xml +++ b/aws-lambda-java-serialization/pom.xml @@ -4,7 +4,7 @@ com.amazonaws aws-lambda-java-serialization - 1.3.0 + 1.2.1 jar AWS Lambda Java Runtime Serialization @@ -32,7 +32,7 @@ 1.8 1.8 com.amazonaws.lambda.thirdparty - 2.18.6 + 2.15.4 2.10.1 20231013 7.3.2 diff --git a/aws-lambda-java-serialization/src/main/java/com/amazonaws/services/lambda/runtime/serialization/events/LambdaEventSerializers.java b/aws-lambda-java-serialization/src/main/java/com/amazonaws/services/lambda/runtime/serialization/events/LambdaEventSerializers.java index 89401a91e..3f01d99b1 100644 --- a/aws-lambda-java-serialization/src/main/java/com/amazonaws/services/lambda/runtime/serialization/events/LambdaEventSerializers.java +++ b/aws-lambda-java-serialization/src/main/java/com/amazonaws/services/lambda/runtime/serialization/events/LambdaEventSerializers.java @@ -19,7 +19,6 @@ import com.amazonaws.services.lambda.runtime.serialization.PojoSerializer; import com.amazonaws.services.lambda.runtime.serialization.util.ReflectUtil; import com.amazonaws.services.lambda.runtime.serialization.util.SerializeUtil; -import com.fasterxml.jackson.databind.PropertyNamingStrategies; import com.fasterxml.jackson.databind.PropertyNamingStrategy; import com.amazonaws.services.lambda.runtime.serialization.events.modules.DateModule; import com.amazonaws.services.lambda.runtime.serialization.events.modules.DateTimeModule; @@ -40,279 +39,304 @@ * * Option 1 (Preferred): * 1. Add Class name to SUPPORTED_EVENTS - * 2. Add Mixin Class to com.amazonaws.services.lambda.runtime.serialization.events.mixins package (if needed) + * 2. Add Mixin Class to + * com.amazonaws.services.lambda.runtime.serialization.events.mixins package (if + * needed) * 3. Add entries to MIXIN_MAP for event class and sub classes (if needed) - * 4. Add entries to NESTED_CLASS_MAP for event class and sub classes (if needed) - * 5. Add entry to NAMING_STRATEGY_MAP (if needed i.e. Could be used in place of a mixin) + * 4. Add entries to NESTED_CLASS_MAP for event class and sub classes (if + * needed) + * 5. Add entry to NAMING_STRATEGY_MAP (if needed i.e. Could be used in place of + * a mixin) * * Option 2 (longer - for event models that do not work with Jackson or GSON): * 1. Add Class name to SUPPORTED_EVENTS - * 2. Add serializer (using org.json) to com.amazonaws.services.lambda.runtime.serialization.events.serializers + * 2. Add serializer (using org.json) to + * com.amazonaws.services.lambda.runtime.serialization.events.serializers * 3. Add class name and serializer to SERIALIZER_MAP */ public class LambdaEventSerializers { - /** - * list of supported events - */ - private static final List SUPPORTED_EVENTS = Stream.of( - "com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent", - "com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent", - "com.amazonaws.services.lambda.runtime.events.CloudFormationCustomResourceEvent", - "com.amazonaws.services.lambda.runtime.events.CloudFrontEvent", - "com.amazonaws.services.lambda.runtime.events.CloudWatchLogsEvent", - "com.amazonaws.services.lambda.runtime.events.CodeCommitEvent", - "com.amazonaws.services.lambda.runtime.events.CognitoEvent", - "com.amazonaws.services.lambda.runtime.events.ConfigEvent", - "com.amazonaws.services.lambda.runtime.events.ConnectEvent", - "com.amazonaws.services.lambda.runtime.events.DynamodbEvent", - "com.amazonaws.services.lambda.runtime.events.DynamodbTimeWindowEvent", - "com.amazonaws.services.lambda.runtime.events.IoTButtonEvent", - "com.amazonaws.services.lambda.runtime.events.KinesisEvent", - "com.amazonaws.services.lambda.runtime.events.KinesisTimeWindowEvent", - "com.amazonaws.services.lambda.runtime.events.KinesisFirehoseEvent", - "com.amazonaws.services.lambda.runtime.events.LambdaDestinationEvent", - "com.amazonaws.services.lambda.runtime.events.LexEvent", - "com.amazonaws.services.lambda.runtime.events.ScheduledEvent", - "com.amazonaws.services.lambda.runtime.events.SecretsManagerRotationEvent", - "com.amazonaws.services.s3.event.S3EventNotification", - "com.amazonaws.services.lambda.runtime.events.models.s3.S3EventNotification", - "com.amazonaws.services.lambda.runtime.events.S3Event", - "com.amazonaws.services.lambda.runtime.events.SNSEvent", - "com.amazonaws.services.lambda.runtime.events.SQSEvent") - .collect(Collectors.toList()); + /** + * list of supported events + */ + private static final List SUPPORTED_EVENTS = Stream.of( + "com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent", + "com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent", + "com.amazonaws.services.lambda.runtime.events.CloudFormationCustomResourceEvent", + "com.amazonaws.services.lambda.runtime.events.CloudFrontEvent", + "com.amazonaws.services.lambda.runtime.events.CloudWatchLogsEvent", + "com.amazonaws.services.lambda.runtime.events.CodeCommitEvent", + "com.amazonaws.services.lambda.runtime.events.CognitoEvent", + "com.amazonaws.services.lambda.runtime.events.ConfigEvent", + "com.amazonaws.services.lambda.runtime.events.ConnectEvent", + "com.amazonaws.services.lambda.runtime.events.DynamodbEvent", + "com.amazonaws.services.lambda.runtime.events.DynamodbTimeWindowEvent", + "com.amazonaws.services.lambda.runtime.events.IoTButtonEvent", + "com.amazonaws.services.lambda.runtime.events.KinesisEvent", + "com.amazonaws.services.lambda.runtime.events.KinesisTimeWindowEvent", + "com.amazonaws.services.lambda.runtime.events.KinesisFirehoseEvent", + "com.amazonaws.services.lambda.runtime.events.LambdaDestinationEvent", + "com.amazonaws.services.lambda.runtime.events.LexEvent", + "com.amazonaws.services.lambda.runtime.events.ScheduledEvent", + "com.amazonaws.services.lambda.runtime.events.SecretsManagerRotationEvent", + "com.amazonaws.services.s3.event.S3EventNotification", + "com.amazonaws.services.lambda.runtime.events.models.s3.S3EventNotification", + "com.amazonaws.services.lambda.runtime.events.S3Event", + "com.amazonaws.services.lambda.runtime.events.SNSEvent", + "com.amazonaws.services.lambda.runtime.events.SQSEvent") + .collect(Collectors.toList()); - /** - * list of events incompatible with Jackson, with serializers explicitly defined - * Classes are incompatible with Jackson for any of the following reasons: - * 1. different constructor/setter types from getter types - * 2. various bugs within Jackson - */ - private static final Map SERIALIZER_MAP = Stream.of( - new SimpleEntry<>("com.amazonaws.services.s3.event.S3EventNotification", new S3EventSerializer<>()), - new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.models.s3.S3EventNotification", new S3EventSerializer<>()), - new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.S3Event", new S3EventSerializer<>())) - .collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue())); + /** + * list of events incompatible with Jackson, with serializers explicitly defined + * Classes are incompatible with Jackson for any of the following reasons: + * 1. different constructor/setter types from getter types + * 2. various bugs within Jackson + */ + private static final Map SERIALIZER_MAP = Stream.of( + new SimpleEntry<>("com.amazonaws.services.s3.event.S3EventNotification", + new S3EventSerializer<>()), + new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.models.s3.S3EventNotification", + new S3EventSerializer<>()), + new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.S3Event", + new S3EventSerializer<>())) + .collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue())); - /** - * Maps supported event classes to mixin classes with Jackson annotations. - * Jackson annotations are not loaded through the ClassLoader so if a Java field is serialized or deserialized from a - * json field that does not match the Jave field name, then a Mixin is required. - */ - @SuppressWarnings("rawtypes") - private static final Map MIXIN_MAP = Stream.of( - new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.CloudFormationCustomResourceEvent", - CloudFormationCustomResourceEventMixin.class), - new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.CloudFrontEvent", - CloudFrontEventMixin.class), - new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.CloudWatchLogsEvent", - CloudWatchLogsEventMixin.class), - new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.CodeCommitEvent", - CodeCommitEventMixin.class), - new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.CodeCommitEvent$Record", - CodeCommitEventMixin.RecordMixin.class), - new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.ConnectEvent", - ConnectEventMixin.class), - new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.ConnectEvent$Details", - ConnectEventMixin.DetailsMixin.class), - new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.ConnectEvent$ContactData", - ConnectEventMixin.ContactDataMixin.class), - new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.ConnectEvent$CustomerEndpoint", - ConnectEventMixin.CustomerEndpointMixin.class), - new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.ConnectEvent$Queue", ConnectEventMixin.QueueMixin.class), - new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.ConnectEvent$SystemEndpoint", - ConnectEventMixin.SystemEndpointMixin.class), - new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.DynamodbEvent", - DynamodbEventMixin.class), - new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.DynamodbEvent$DynamodbStreamRecord", - DynamodbEventMixin.DynamodbStreamRecordMixin.class), - new SimpleEntry<>("com.amazonaws.services.dynamodbv2.model.StreamRecord", - DynamodbEventMixin.StreamRecordMixin.class), - new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.models.dynamodb.StreamRecord", - DynamodbEventMixin.StreamRecordMixin.class), - new SimpleEntry<>("com.amazonaws.services.dynamodbv2.model.AttributeValue", - DynamodbEventMixin.AttributeValueMixin.class), - new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.models.dynamodb.AttributeValue", - DynamodbEventMixin.AttributeValueMixin.class), - new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.DynamodbTimeWindowEvent", - DynamodbTimeWindowEventMixin.class), - new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.KinesisEvent", - KinesisEventMixin.class), - new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.KinesisEvent$Record", - KinesisEventMixin.RecordMixin.class), - new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.KinesisTimeWindowEvent", - KinesisTimeWindowEventMixin.class), - new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.ScheduledEvent", - ScheduledEventMixin.class), - new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.SecretsManagerRotationEvent", - SecretsManagerRotationEventMixin.class), - new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.SNSEvent", - SNSEventMixin.class), - new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.SNSEvent$SNSRecord", - SNSEventMixin.SNSRecordMixin.class), - new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.SQSEvent", - SQSEventMixin.class), - new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.SQSEvent$SQSMessage", - SQSEventMixin.SQSMessageMixin.class)) - .collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue())); + /** + * Maps supported event classes to mixin classes with Jackson annotations. + * Jackson annotations are not loaded through the ClassLoader so if a Java field + * is serialized or deserialized from a + * json field that does not match the Jave field name, then a Mixin is required. + */ + @SuppressWarnings("rawtypes") + private static final Map MIXIN_MAP = Stream.of( + new SimpleEntry<>( + "com.amazonaws.services.lambda.runtime.events.CloudFormationCustomResourceEvent", + CloudFormationCustomResourceEventMixin.class), + new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.CloudFrontEvent", + CloudFrontEventMixin.class), + new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.CloudWatchLogsEvent", + CloudWatchLogsEventMixin.class), + new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.CodeCommitEvent", + CodeCommitEventMixin.class), + new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.CodeCommitEvent$Record", + CodeCommitEventMixin.RecordMixin.class), + new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.ConnectEvent", + ConnectEventMixin.class), + new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.ConnectEvent$Details", + ConnectEventMixin.DetailsMixin.class), + new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.ConnectEvent$ContactData", + ConnectEventMixin.ContactDataMixin.class), + new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.ConnectEvent$CustomerEndpoint", + ConnectEventMixin.CustomerEndpointMixin.class), + new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.ConnectEvent$Queue", + ConnectEventMixin.QueueMixin.class), + new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.ConnectEvent$SystemEndpoint", + ConnectEventMixin.SystemEndpointMixin.class), + new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.DynamodbEvent", + DynamodbEventMixin.class), + new SimpleEntry<>( + "com.amazonaws.services.lambda.runtime.events.DynamodbEvent$DynamodbStreamRecord", + DynamodbEventMixin.DynamodbStreamRecordMixin.class), + new SimpleEntry<>("com.amazonaws.services.dynamodbv2.model.StreamRecord", + DynamodbEventMixin.StreamRecordMixin.class), + new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.models.dynamodb.StreamRecord", + DynamodbEventMixin.StreamRecordMixin.class), + new SimpleEntry<>("com.amazonaws.services.dynamodbv2.model.AttributeValue", + DynamodbEventMixin.AttributeValueMixin.class), + new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.models.dynamodb.AttributeValue", + DynamodbEventMixin.AttributeValueMixin.class), + new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.DynamodbTimeWindowEvent", + DynamodbTimeWindowEventMixin.class), + new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.KinesisEvent", + KinesisEventMixin.class), + new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.KinesisEvent$Record", + KinesisEventMixin.RecordMixin.class), + new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.KinesisTimeWindowEvent", + KinesisTimeWindowEventMixin.class), + new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.ScheduledEvent", + ScheduledEventMixin.class), + new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.SecretsManagerRotationEvent", + SecretsManagerRotationEventMixin.class), + new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.SNSEvent", + SNSEventMixin.class), + new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.SNSEvent$SNSRecord", + SNSEventMixin.SNSRecordMixin.class), + new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.SQSEvent", + SQSEventMixin.class), + new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.SQSEvent$SQSMessage", + SQSEventMixin.SQSMessageMixin.class)) + .collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue())); - /** - * If mixins are required for inner classes of an event, then those nested classes must be specified here. - */ - @SuppressWarnings("rawtypes") - private static final Map> NESTED_CLASS_MAP = Stream.of( - new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.CodeCommitEvent", - Arrays.asList( - new NestedClass("com.amazonaws.services.lambda.runtime.events.CodeCommitEvent$Record"))), - new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.CognitoEvent", - Arrays.asList( - new NestedClass("com.amazonaws.services.lambda.runtime.events.CognitoEvent$DatasetRecord"))), - new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.ConnectEvent", - Arrays.asList( - new NestedClass("com.amazonaws.services.lambda.runtime.events.ConnectEvent$Details"), - new NestedClass("com.amazonaws.services.lambda.runtime.events.ConnectEvent$ContactData"), - new NestedClass("com.amazonaws.services.lambda.runtime.events.ConnectEvent$CustomerEndpoint"), - new NestedClass("com.amazonaws.services.lambda.runtime.events.ConnectEvent$Queue"), - new NestedClass("com.amazonaws.services.lambda.runtime.events.ConnectEvent$SystemEndpoint"))), - new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.DynamodbEvent", - Arrays.asList( - new AlternateNestedClass( - "com.amazonaws.services.lambda.runtime.events.models.dynamodb.AttributeValue", - "com.amazonaws.services.dynamodbv2.model.AttributeValue"), - new AlternateNestedClass( - "com.amazonaws.services.lambda.runtime.events.models.dynamodb.StreamRecord", - "com.amazonaws.services.dynamodbv2.model.StreamRecord"), - new NestedClass("com.amazonaws.services.lambda.runtime.events.DynamodbEvent$DynamodbStreamRecord"))), - new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.DynamodbEvent$DynamodbStreamRecord", - Arrays.asList( - new AlternateNestedClass( - "com.amazonaws.services.lambda.runtime.events.models.dynamodb.AttributeValue", - "com.amazonaws.services.dynamodbv2.model.AttributeValue"), - new AlternateNestedClass( - "com.amazonaws.services.lambda.runtime.events.models.dynamodb.StreamRecord", - "com.amazonaws.services.dynamodbv2.model.StreamRecord"))), - new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.DynamodbTimeWindowEvent", - Arrays.asList( - new AlternateNestedClass( - "com.amazonaws.services.lambda.runtime.events.models.dynamodb.AttributeValue", - "com.amazonaws.services.dynamodbv2.model.AttributeValue"), - new AlternateNestedClass( - "com.amazonaws.services.lambda.runtime.events.models.dynamodb.StreamRecord", - "com.amazonaws.services.dynamodbv2.model.StreamRecord"), - new NestedClass("com.amazonaws.services.lambda.runtime.events.DynamodbEvent$DynamodbStreamRecord"))), - new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.KinesisEvent", - Arrays.asList( - new NestedClass("com.amazonaws.services.lambda.runtime.events.KinesisEvent$Record"))), - new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.SNSEvent", - Arrays.asList( - new NestedClass("com.amazonaws.services.lambda.runtime.events.SNSEvent$SNSRecord"))), - new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.SQSEvent", - Arrays.asList( - new NestedClass("com.amazonaws.services.lambda.runtime.events.SQSEvent$SQSMessage")))) - .collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue())); + /** + * If mixins are required for inner classes of an event, then those nested + * classes must be specified here. + */ + @SuppressWarnings("rawtypes") + private static final Map> NESTED_CLASS_MAP = Stream.of( + new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.CodeCommitEvent", + Arrays.asList( + new NestedClass("com.amazonaws.services.lambda.runtime.events.CodeCommitEvent$Record"))), + new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.CognitoEvent", + Arrays.asList( + new NestedClass("com.amazonaws.services.lambda.runtime.events.CognitoEvent$DatasetRecord"))), + new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.ConnectEvent", + Arrays.asList( + new NestedClass("com.amazonaws.services.lambda.runtime.events.ConnectEvent$Details"), + new NestedClass("com.amazonaws.services.lambda.runtime.events.ConnectEvent$ContactData"), + new NestedClass("com.amazonaws.services.lambda.runtime.events.ConnectEvent$CustomerEndpoint"), + new NestedClass("com.amazonaws.services.lambda.runtime.events.ConnectEvent$Queue"), + new NestedClass("com.amazonaws.services.lambda.runtime.events.ConnectEvent$SystemEndpoint"))), + new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.DynamodbEvent", + Arrays.asList( + new AlternateNestedClass( + "com.amazonaws.services.lambda.runtime.events.models.dynamodb.AttributeValue", + "com.amazonaws.services.dynamodbv2.model.AttributeValue"), + new AlternateNestedClass( + "com.amazonaws.services.lambda.runtime.events.models.dynamodb.StreamRecord", + "com.amazonaws.services.dynamodbv2.model.StreamRecord"), + new NestedClass("com.amazonaws.services.lambda.runtime.events.DynamodbEvent$DynamodbStreamRecord"))), + new SimpleEntry<>( + "com.amazonaws.services.lambda.runtime.events.DynamodbEvent$DynamodbStreamRecord", + Arrays.asList( + new AlternateNestedClass( + "com.amazonaws.services.lambda.runtime.events.models.dynamodb.AttributeValue", + "com.amazonaws.services.dynamodbv2.model.AttributeValue"), + new AlternateNestedClass( + "com.amazonaws.services.lambda.runtime.events.models.dynamodb.StreamRecord", + "com.amazonaws.services.dynamodbv2.model.StreamRecord"))), + new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.DynamodbTimeWindowEvent", + Arrays.asList( + new AlternateNestedClass( + "com.amazonaws.services.lambda.runtime.events.models.dynamodb.AttributeValue", + "com.amazonaws.services.dynamodbv2.model.AttributeValue"), + new AlternateNestedClass( + "com.amazonaws.services.lambda.runtime.events.models.dynamodb.StreamRecord", + "com.amazonaws.services.dynamodbv2.model.StreamRecord"), + new NestedClass("com.amazonaws.services.lambda.runtime.events.DynamodbEvent$DynamodbStreamRecord"))), + new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.KinesisEvent", + Arrays.asList( + new NestedClass("com.amazonaws.services.lambda.runtime.events.KinesisEvent$Record"))), + new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.SNSEvent", + Arrays.asList( + new NestedClass("com.amazonaws.services.lambda.runtime.events.SNSEvent$SNSRecord"))), + new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.SQSEvent", + Arrays.asList( + new NestedClass("com.amazonaws.services.lambda.runtime.events.SQSEvent$SQSMessage")))) + .collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue())); - /** - * If event requires a naming strategy. For example, when someone names the getter method getSNS and the setter - * method setSns, for some magical reasons, using both mixins and a naming strategy works - */ - private static final Map NAMING_STRATEGY_MAP = Stream.of( - new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.SNSEvent", - new PropertyNamingStrategies.UpperCamelCaseStrategy()), - new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.ConnectEvent$Queue", - new PropertyNamingStrategies.UpperCamelCaseStrategy()) - ) - .collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue())); + /** + * If event requires a naming strategy. For example, when someone names the + * getter method getSNS and the setter + * method setSns, for some magical reasons, using both mixins and a naming + * strategy works + */ + private static final Map NAMING_STRATEGY_MAP = Stream.of( + new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.SNSEvent", + new PropertyNamingStrategy.PascalCaseStrategy()), + new SimpleEntry<>("com.amazonaws.services.lambda.runtime.events.ConnectEvent$Queue", + new PropertyNamingStrategy.PascalCaseStrategy())) + .collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue())); - /** - * Returns whether the class name is a Lambda supported event model. - * @param className class name as string - * @return whether the event model is supported - */ - public static boolean isLambdaSupportedEvent(String className) { - return SUPPORTED_EVENTS.contains(className); - } - - /** - * Return a serializer for the event class - * @return a specific PojoSerializer or modified JacksonFactory instance with mixins and modules added in - */ - @SuppressWarnings({"unchecked"}) - public static PojoSerializer serializerFor(Class eventClass, ClassLoader classLoader) { - // if serializer specifically defined for event then use that - if (SERIALIZER_MAP.containsKey(eventClass.getName())) { - return SERIALIZER_MAP.get(eventClass.getName()).withClass(eventClass).withClassLoader(classLoader); - } - // else use a Jackson ObjectMapper instance - JacksonFactory factory = JacksonFactory.getInstance(); - // if mixins required for class, then apply - if (MIXIN_MAP.containsKey(eventClass.getName())) { - factory = factory.withMixin(eventClass, MIXIN_MAP.get(eventClass.getName())); + /** + * Returns whether the class name is a Lambda supported event model. + * + * @param className class name as string + * @return whether the event model is supported + */ + public static boolean isLambdaSupportedEvent(String className) { + return SUPPORTED_EVENTS.contains(className); } - // if event model has nested classes then load those classes and check if mixins apply - if (NESTED_CLASS_MAP.containsKey(eventClass.getName())) { - List nestedClasses = NESTED_CLASS_MAP.get(eventClass.getName()); - for (NestedClass nestedClass: nestedClasses) { - // if mixin exists for nested class then apply - if (MIXIN_MAP.containsKey(nestedClass.className)) { - factory = tryLoadingNestedClass(classLoader, factory, nestedClass); + + /** + * Return a serializer for the event class + * + * @return a specific PojoSerializer or modified JacksonFactory instance with + * mixins and modules added in + */ + @SuppressWarnings({ "unchecked" }) + public static PojoSerializer serializerFor(Class eventClass, ClassLoader classLoader) { + // if serializer specifically defined for event then use that + if (SERIALIZER_MAP.containsKey(eventClass.getName())) { + return SERIALIZER_MAP.get(eventClass.getName()).withClass(eventClass) + .withClassLoader(classLoader); } - } - } - // load DateModules - factory.getMapper().registerModules(new DateModule(), new DateTimeModule(classLoader)); - // load naming strategy if needed - if (NAMING_STRATEGY_MAP.containsKey(eventClass.getName())) { - factory = factory.withNamingStrategy(NAMING_STRATEGY_MAP.get(eventClass.getName())); + // else use a Jackson ObjectMapper instance + JacksonFactory factory = JacksonFactory.getInstance(); + // if mixins required for class, then apply + if (MIXIN_MAP.containsKey(eventClass.getName())) { + factory = factory.withMixin(eventClass, MIXIN_MAP.get(eventClass.getName())); + } + // if event model has nested classes then load those classes and check if mixins + // apply + if (NESTED_CLASS_MAP.containsKey(eventClass.getName())) { + List nestedClasses = NESTED_CLASS_MAP.get(eventClass.getName()); + for (NestedClass nestedClass : nestedClasses) { + // if mixin exists for nested class then apply + if (MIXIN_MAP.containsKey(nestedClass.className)) { + factory = tryLoadingNestedClass(classLoader, factory, nestedClass); + } + } + } + // load DateModules + factory.getMapper().registerModules(new DateModule(), new DateTimeModule(classLoader)); + // load naming strategy if needed + if (NAMING_STRATEGY_MAP.containsKey(eventClass.getName())) { + factory = factory.withNamingStrategy(NAMING_STRATEGY_MAP.get(eventClass.getName())); + } + return factory.getSerializer(eventClass); } - return factory.getSerializer(eventClass); - } - /** - * Tries to load a nested class with its defined mixin from {@link #MIXIN_MAP} into the {@link JacksonFactory} object. - * Will allow initial failure for {@link AlternateNestedClass} objects and try again with their alternate class name - * @return a modified JacksonFactory instance with mixins added in - */ - private static JacksonFactory tryLoadingNestedClass(ClassLoader classLoader, JacksonFactory factory, NestedClass nestedClass) { - Class eventClazz; - Class mixinClazz; - try { - eventClazz = SerializeUtil.loadCustomerClass(nestedClass.getClassName(), classLoader); - mixinClazz = MIXIN_MAP.get(nestedClass.getClassName()); - } catch (ReflectUtil.ReflectException e) { - if (nestedClass instanceof AlternateNestedClass) { - AlternateNestedClass alternateNestedClass = (AlternateNestedClass) nestedClass; - eventClazz = SerializeUtil.loadCustomerClass(alternateNestedClass.getAlternateClassName(), classLoader); - mixinClazz = MIXIN_MAP.get(alternateNestedClass.getAlternateClassName()); - } else { - throw e; - } - } + /** + * Tries to load a nested class with its defined mixin from {@link #MIXIN_MAP} + * into the {@link JacksonFactory} object. + * Will allow initial failure for {@link AlternateNestedClass} objects and try + * again with their alternate class name + * + * @return a modified JacksonFactory instance with mixins added in + */ + private static JacksonFactory tryLoadingNestedClass(ClassLoader classLoader, JacksonFactory factory, + NestedClass nestedClass) { + Class eventClazz; + Class mixinClazz; + try { + eventClazz = SerializeUtil.loadCustomerClass(nestedClass.getClassName(), classLoader); + mixinClazz = MIXIN_MAP.get(nestedClass.getClassName()); + } catch (ReflectUtil.ReflectException e) { + if (nestedClass instanceof AlternateNestedClass) { + AlternateNestedClass alternateNestedClass = (AlternateNestedClass) nestedClass; + eventClazz = SerializeUtil.loadCustomerClass( + alternateNestedClass.getAlternateClassName(), classLoader); + mixinClazz = MIXIN_MAP.get(alternateNestedClass.getAlternateClassName()); + } else { + throw e; + } + } - return factory.withMixin(eventClazz, mixinClazz); - } + return factory.withMixin(eventClazz, mixinClazz); + } - private static class NestedClass { - private final String className; + private static class NestedClass { + private final String className; - protected NestedClass(String className) { - this.className = className; - } + protected NestedClass(String className) { + this.className = className; + } - protected String getClassName() { - return className; + protected String getClassName() { + return className; + } } - } - private static class AlternateNestedClass extends NestedClass { - private final String alternateClassName; + private static class AlternateNestedClass extends NestedClass { + private final String alternateClassName; - private AlternateNestedClass(String className, String alternateClassName) { - super(className); - this.alternateClassName = alternateClassName; - } + private AlternateNestedClass(String className, String alternateClassName) { + super(className); + this.alternateClassName = alternateClassName; + } - private String getAlternateClassName() { - return alternateClassName; + private String getAlternateClassName() { + return alternateClassName; + } } - } } diff --git a/aws-lambda-java-tests/src/test/java/com/amazonaws/services/lambda/runtime/tests/JodaDateTimeDeserializationTest.java b/aws-lambda-java-tests/src/test/java/com/amazonaws/services/lambda/runtime/tests/JodaDateTimeDeserializationTest.java new file mode 100644 index 000000000..4aa3e199b --- /dev/null +++ b/aws-lambda-java-tests/src/test/java/com/amazonaws/services/lambda/runtime/tests/JodaDateTimeDeserializationTest.java @@ -0,0 +1,63 @@ +/* Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. */ +package com.amazonaws.services.lambda.runtime.tests; + +import com.amazonaws.services.lambda.runtime.events.CodeCommitEvent; +import com.amazonaws.services.lambda.runtime.events.LambdaDestinationEvent; +import com.amazonaws.services.lambda.runtime.events.SNSEvent; +import com.amazonaws.services.lambda.runtime.events.ScheduledEvent; +import org.joda.time.DateTime; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Bug condition exploration tests for Joda DateTime deserialization. + * + * Validates: Requirements 1.1, 1.2, 1.3, 1.4, 1.5 + * + * These tests verify that event types with org.joda.time.DateTime fields + * deserialize correctly in an unshaded environment. Prior to the fix, + * Jackson 2.18.6 would throw MismatchedInputException because the + * DateTimeModule registered for the shaded class path rather than + * org.joda.time.DateTime. + */ +public class JodaDateTimeDeserializationTest { + + @Test + public void testLambdaDestinationEventDateTimeDeserialization() { + LambdaDestinationEvent event = EventLoader.loadLambdaDestinationEvent("lambda_destination_event.json"); + + assertThat(event).isNotNull(); + assertThat(event.getTimestamp()).isEqualTo(DateTime.parse("2019-11-24T21:52:47.333Z")); + } + + @Test + public void testScheduledEventDateTimeDeserialization() { + ScheduledEvent event = EventLoader.loadScheduledEvent("cloudwatch_event.json"); + + assertThat(event).isNotNull(); + assertThat(event.getTime()).isEqualTo(DateTime.parse("2020-09-30T15:58:34Z")); + } + + @Test + public void testCodeCommitEventDateTimeDeserialization() { + CodeCommitEvent event = EventLoader.loadCodeCommitEvent("codecommit_event.json"); + + assertThat(event).isNotNull(); + assertThat(event.getRecords()).isNotEmpty(); + + CodeCommitEvent.Record record = event.getRecords().get(0); + assertThat(record.getEventTime()).isEqualTo(DateTime.parse("2016-01-01T23:59:59.000+0000")); + } + + @Test + public void testSNSEventDateTimeDeserialization() { + SNSEvent event = EventLoader.loadSNSEvent("sns_event.json"); + + assertThat(event).isNotNull(); + assertThat(event.getRecords()).isNotEmpty(); + + SNSEvent.SNS sns = event.getRecords().get(0).getSNS(); + assertThat(sns.getTimestamp()).isEqualTo(DateTime.parse("2020-10-08T16:06:14.656Z")); + } +} From 5b6c57366fc59e6f8c5695acf610494119d62ba0 Mon Sep 17 00:00:00 2001 From: Davide Melfi Date: Thu, 19 Mar 2026 15:39:27 +0000 Subject: [PATCH 08/10] chore: removing comment --- aws-lambda-java-tests/pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/aws-lambda-java-tests/pom.xml b/aws-lambda-java-tests/pom.xml index 11f3da00b..1ff76a76e 100644 --- a/aws-lambda-java-tests/pom.xml +++ b/aws-lambda-java-tests/pom.xml @@ -1,4 +1,3 @@ - 4.0.0 From b8ead10df26f58cbe42778a8cf3264a519a50ea8 Mon Sep 17 00:00:00 2001 From: Davide Melfi Date: Thu, 19 Mar 2026 15:51:09 +0000 Subject: [PATCH 09/10] chore: new version --- aws-lambda-java-serialization/RELEASE.CHANGELOG.md | 2 +- aws-lambda-java-serialization/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/aws-lambda-java-serialization/RELEASE.CHANGELOG.md b/aws-lambda-java-serialization/RELEASE.CHANGELOG.md index b2c3e739d..4a0e8ca2a 100644 --- a/aws-lambda-java-serialization/RELEASE.CHANGELOG.md +++ b/aws-lambda-java-serialization/RELEASE.CHANGELOG.md @@ -1,5 +1,5 @@ ### March 19, 2026 -`1.2.1`: +`1.3.1`: - Revert `jackson-databind` dependency from 2.18.6 to 2.15.4 - Revert `PropertyNamingStrategies.UpperCamelCaseStrategy` to `PropertyNamingStrategy.PascalCaseStrategy` diff --git a/aws-lambda-java-serialization/pom.xml b/aws-lambda-java-serialization/pom.xml index 8ed303e29..a71eb1f8d 100644 --- a/aws-lambda-java-serialization/pom.xml +++ b/aws-lambda-java-serialization/pom.xml @@ -4,7 +4,7 @@ com.amazonaws aws-lambda-java-serialization - 1.2.1 + 1.3.1 jar AWS Lambda Java Runtime Serialization From 9d9dd99ca6df45b5f481cc09debd7f3f326cc1f7 Mon Sep 17 00:00:00 2001 From: Davide Melfi Date: Thu, 19 Mar 2026 16:01:55 +0000 Subject: [PATCH 10/10] chore: remove file --- .../JodaDateTimeDeserializationTest.java | 63 ------------------- 1 file changed, 63 deletions(-) delete mode 100644 aws-lambda-java-tests/src/test/java/com/amazonaws/services/lambda/runtime/tests/JodaDateTimeDeserializationTest.java diff --git a/aws-lambda-java-tests/src/test/java/com/amazonaws/services/lambda/runtime/tests/JodaDateTimeDeserializationTest.java b/aws-lambda-java-tests/src/test/java/com/amazonaws/services/lambda/runtime/tests/JodaDateTimeDeserializationTest.java deleted file mode 100644 index 4aa3e199b..000000000 --- a/aws-lambda-java-tests/src/test/java/com/amazonaws/services/lambda/runtime/tests/JodaDateTimeDeserializationTest.java +++ /dev/null @@ -1,63 +0,0 @@ -/* Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. */ -package com.amazonaws.services.lambda.runtime.tests; - -import com.amazonaws.services.lambda.runtime.events.CodeCommitEvent; -import com.amazonaws.services.lambda.runtime.events.LambdaDestinationEvent; -import com.amazonaws.services.lambda.runtime.events.SNSEvent; -import com.amazonaws.services.lambda.runtime.events.ScheduledEvent; -import org.joda.time.DateTime; -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Bug condition exploration tests for Joda DateTime deserialization. - * - * Validates: Requirements 1.1, 1.2, 1.3, 1.4, 1.5 - * - * These tests verify that event types with org.joda.time.DateTime fields - * deserialize correctly in an unshaded environment. Prior to the fix, - * Jackson 2.18.6 would throw MismatchedInputException because the - * DateTimeModule registered for the shaded class path rather than - * org.joda.time.DateTime. - */ -public class JodaDateTimeDeserializationTest { - - @Test - public void testLambdaDestinationEventDateTimeDeserialization() { - LambdaDestinationEvent event = EventLoader.loadLambdaDestinationEvent("lambda_destination_event.json"); - - assertThat(event).isNotNull(); - assertThat(event.getTimestamp()).isEqualTo(DateTime.parse("2019-11-24T21:52:47.333Z")); - } - - @Test - public void testScheduledEventDateTimeDeserialization() { - ScheduledEvent event = EventLoader.loadScheduledEvent("cloudwatch_event.json"); - - assertThat(event).isNotNull(); - assertThat(event.getTime()).isEqualTo(DateTime.parse("2020-09-30T15:58:34Z")); - } - - @Test - public void testCodeCommitEventDateTimeDeserialization() { - CodeCommitEvent event = EventLoader.loadCodeCommitEvent("codecommit_event.json"); - - assertThat(event).isNotNull(); - assertThat(event.getRecords()).isNotEmpty(); - - CodeCommitEvent.Record record = event.getRecords().get(0); - assertThat(record.getEventTime()).isEqualTo(DateTime.parse("2016-01-01T23:59:59.000+0000")); - } - - @Test - public void testSNSEventDateTimeDeserialization() { - SNSEvent event = EventLoader.loadSNSEvent("sns_event.json"); - - assertThat(event).isNotNull(); - assertThat(event.getRecords()).isNotEmpty(); - - SNSEvent.SNS sns = event.getRecords().get(0).getSNS(); - assertThat(sns.getTimestamp()).isEqualTo(DateTime.parse("2020-10-08T16:06:14.656Z")); - } -}