Skip to content

AutoGeneratedTimestampRecordExtension doesn't take into account manually provided schema for nested attributes. #6410

@SimY4

Description

@SimY4

Describe the bug

Given dynamoDBEnhanced client:

    DynamoDbEnhancedAsyncClient.builder()
        .dynamoDbClient(dynamoDB)
        .extensions(
            AutoGeneratedTimestampRecordExtension.builder().build()
        .build()

and a table schema manually written like somewhat like this:

    TableSchema.builder(Entity.class, ImmutableEntity.Builder.class)
        .newItemBuilder(ImmutableEntity::builder, ImmutableEntity.Builder::build)
        .addAttribute(
            EnhancedType.listOf(EnhancedType.documentOf(Email.class, Email.schema())),
            a ->
                a.name("email")
                    .getter(Entity::getEmails)
                    .setter(ImmutableEntity.Builder::addAllEmails))
        
        .addAttribute(
            Instant.class,
            a ->
                a.name("updated")
                    .getter(Entity::getUpdated)
                    .setter(ImmutableEntity.Builder::updated)
                    .tags(
                        AutoGeneratedTimestampRecordExtension.AttributeTags
                            .autoGeneratedTimestampAttribute()))
        .build();

This would fail to create/update record with:

java.lang.IllegalArgumentException: Class does not appear to be a valid DynamoDb annotated class. [class = "interface com.github.simy4.poc.model.Email"]
	at software.amazon.awssdk.enhanced.dynamodb.TableSchema.fromClass(TableSchema.java:211)
	Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: 
Error has been observed at the following site(s):
	*__checkpoint ⇢ HTTP POST "/v1/entities" [ExceptionHandlingWebHandler]
Original Stack Trace:
		at software.amazon.awssdk.enhanced.dynamodb.TableSchema.fromClass(TableSchema.java:211)
		at software.amazon.awssdk.enhanced.dynamodb.internal.extensions.utility.NestedRecordUtils.getTableSchemaForListElement(NestedRecordUtils.java:56)
		at software.amazon.awssdk.enhanced.dynamodb.extensions.AutoGeneratedTimestampRecordExtension.lambda$beforeWrite$1(AutoGeneratedTimestampRecordExtension.java:155)
		at java.base/java.util.HashMap.forEach(HashMap.java:1430)
		at software.amazon.awssdk.enhanced.dynamodb.extensions.AutoGeneratedTimestampRecordExtension.beforeWrite(AutoGeneratedTimestampRecordExtension.java:147)
		at software.amazon.awssdk.enhanced.dynamodb.internal.extensions.ChainExtension.beforeWrite(ChainExtension.java:113)
		at software.amazon.awssdk.enhanced.dynamodb.internal.operations.UpdateItemOperation.generateRequest(UpdateItemOperation.java:117)
		at software.amazon.awssdk.enhanced.dynamodb.internal.operations.UpdateItemOperation.generateRequest(UpdateItemOperation.java:55)
		at software.amazon.awssdk.enhanced.dynamodb.internal.operations.CommonOperation.executeAsync(CommonOperation.java:139)
		at software.amazon.awssdk.enhanced.dynamodb.internal.operations.TableOperation.executeOnPrimaryIndexAsync(TableOperation.java:81)
		at software.amazon.awssdk.enhanced.dynamodb.internal.client.DefaultDynamoDbAsyncTable.updateItem(DefaultDynamoDbAsyncTable.java:278)
		at software.amazon.awssdk.enhanced.dynamodb.internal.client.DefaultDynamoDbAsyncTable.updateItem(DefaultDynamoDbAsyncTable.java:287)
		at software.amazon.awssdk.enhanced.dynamodb.internal.client.DefaultDynamoDbAsyncTable.updateItem(DefaultDynamoDbAsyncTable.java:307)
		at com.github.simy4.poc.repositories.EntityCrudRepository.save(EntityCrudRepository.java:29)

I believe that is happening due to the fact that AutoGeneratedTimestampRecordExtension doesn't take provided schema into account and discovers the schema based on annotation which it fails to do, since there are no annotations provided.

Regression Issue

  • Select this option if this issue appears to be a regression.

Expected Behavior

Manually provided schema should be used during extension attributes discovery.

Current Behavior

Extension fails with exception.

java.lang.IllegalArgumentException: Class does not appear to be a valid DynamoDb annotated class. [class = "interface com.github.simy4.poc.model.Email"]
	at software.amazon.awssdk.enhanced.dynamodb.TableSchema.fromClass(TableSchema.java:211)
	Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: 
Error has been observed at the following site(s):
	*__checkpoint ⇢ HTTP POST "/v1/entities" [ExceptionHandlingWebHandler]
Original Stack Trace:
		at software.amazon.awssdk.enhanced.dynamodb.TableSchema.fromClass(TableSchema.java:211)
		at software.amazon.awssdk.enhanced.dynamodb.internal.extensions.utility.NestedRecordUtils.getTableSchemaForListElement(NestedRecordUtils.java:56)
		at software.amazon.awssdk.enhanced.dynamodb.extensions.AutoGeneratedTimestampRecordExtension.lambda$beforeWrite$1(AutoGeneratedTimestampRecordExtension.java:155)
		at java.base/java.util.HashMap.forEach(HashMap.java:1430)
		at software.amazon.awssdk.enhanced.dynamodb.extensions.AutoGeneratedTimestampRecordExtension.beforeWrite(AutoGeneratedTimestampRecordExtension.java:147)
		at software.amazon.awssdk.enhanced.dynamodb.internal.extensions.ChainExtension.beforeWrite(ChainExtension.java:113)
		at software.amazon.awssdk.enhanced.dynamodb.internal.operations.UpdateItemOperation.generateRequest(UpdateItemOperation.java:117)
		at software.amazon.awssdk.enhanced.dynamodb.internal.operations.UpdateItemOperation.generateRequest(UpdateItemOperation.java:55)
		at software.amazon.awssdk.enhanced.dynamodb.internal.operations.CommonOperation.executeAsync(CommonOperation.java:139)
		at software.amazon.awssdk.enhanced.dynamodb.internal.operations.TableOperation.executeOnPrimaryIndexAsync(TableOperation.java:81)
		at software.amazon.awssdk.enhanced.dynamodb.internal.client.DefaultDynamoDbAsyncTable.updateItem(DefaultDynamoDbAsyncTable.java:278)
		at software.amazon.awssdk.enhanced.dynamodb.internal.client.DefaultDynamoDbAsyncTable.updateItem(DefaultDynamoDbAsyncTable.java:287)
		at software.amazon.awssdk.enhanced.dynamodb.internal.client.DefaultDynamoDbAsyncTable.updateItem(DefaultDynamoDbAsyncTable.java:307)
		at com.github.simy4.poc.repositories.EntityCrudRepository.save(EntityCrudRepository.java:29)

Reproduction Steps

Issue is reproducible in this branch of a public repo: SimY4/ImmutablesDynamoDBMapperPOC#509

Possible Solution

Take provided schema for attributes discovery.

Additional Information/Context

No response

AWS Java SDK version used

2.33.4

JDK version used

21

Operating System and version

Linux

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions