AWS SDK v2 DynamoDB自动生成时间戳后实体getCreatedOn返回null问题
AWS SDK v2自动生成时间字段后实体无法读取值的问题分析
背景与问题描述
在AWS SDK v1中,我们使用以下注解实现自动生成创建时间字段:
@DynamoDBAutoGeneratedTimestamp(strategy = DynamoDBAutoGenerateStrategy.CREATE)
升级至AWS SDK v2后,替换为以下实现:
实体类方法注解
@DynamoDbUpdateBehavior(UpdateBehavior.WRITE_IF_NOT_EXISTS) @DynamoDbAutoGeneratedTimeStampAttribute public Instant getCreatedOn() { return createdOn;}
Enhanced Client配置
.extensions(AutoGeneratedTimestampRecordExtension.create())
目前遇到的问题:数据已成功写入DynamoDB,但调用同一实体对象的getCreatedOn()方法返回null,而SDK v1中执行相同操作后可以直接从实体读取到生成的时间值。
可能的原因
SDK版本间的字段生成时机差异:SDK v1的自动生成逻辑会在写入操作执行前,将生成的时间值直接赋值到内存中的实体对象,因此写入后能立即从实体读取到值;而SDK v2的
AutoGeneratedTimestampRecordExtension是在构建发送给DynamoDB的请求时才生成时间并添加到请求里,不会修改本地内存中的实体对象,所以实体的createdOn字段始终为null。注解与扩展的逻辑设计限制:
@DynamoDbUpdateBehavior(UpdateBehavior.WRITE_IF_NOT_EXISTS)仅保证DynamoDB层面首次创建时写入时间值,但该注解和自动生成逻辑的组合并不会触发本地实体字段的更新,仅在数据库端完成赋值操作,内存对象未同步该值。Enhanced Client扩展的特性定位:
AutoGeneratedTimestampRecordExtension的设计目标是处理请求层面的字段填充,而非同步更新本地实体状态。它不会在写入完成后将生成的时间值回写到实体对象中,这是v2与v1在自动生成字段行为上的核心区别。
可选解决方式
如果需要在写入后获取该时间值,可采用以下两种方式:
- 写入操作完成后,立即从DynamoDB中重新读取该实体,此时能获取到数据库中存储的生成时间。
- 手动在写入前生成时间值并设置到实体的
createdOn字段,同时保留@DynamoDbUpdateBehavior(UpdateBehavior.WRITE_IF_NOT_EXISTS)注解,确保DynamoDB层面的幂等性,避免重复写入时间。
内容的提问来源于stack exchange,提问作者adarsh
相关产品推荐
相关产品推荐

