【以下的问题经过翻译处理】 使用DynamodbMapper注释的Java表模型:
/**
* Defines model for the DDB items stored in Documents table
*/
@Data // @Value not used as it cannot work with @NoArgsConstructor
@NoArgsConstructor // Required by DDBMapper for initialization
@AllArgsConstructor
@Builder(toBuilder = true)
@DynamoDBTable(tableName = DocumentModel.TABLE_NAME)
public class DocumentModel {
public static final String TABLE_NAME = "Document";
/**
* Document id used to fetch a document's details.
*/
@NonNull
@DynamoDBHashKey
@DynamoDBTypeConverted(converter = ACIConverter.class)
private ACI id;
/**
* Version for a document, DDBMapper will update the version every time an overwrite of the same object occurs.
*/
@DynamoDBRangeKey
@DynamoDBVersionAttribute
private int version;
}
我正在尝试使用DynamoDBMapper创建具有上述模型的表。 我正在遵循AWS的最佳做法:https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-sort-keys.html#bp-sort-keys-version-control通过使用注释@DynamoDBVersionAttribute在范围键中对对象进行版本控制。
但是,当我尝试在使用DynamoDBLocal的测试中运行构建表时,我收到以下错误:
[junit] Testsuite: com.amazon.dithreatmodelingservicelambda.database.DocumentDaoTest
[junit] Tests run: 0, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 4.995 sec
[junit]
[junit] Testcase: com.amazon.dithreatmodelingservicelambda.database.DocumentDaoTest: Caused an ERROR
[junit] DocumentModel[version] could not be mapped for type int
[junit] com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMappingException: DocumentModel[version] could not be mapped for type int
[junit] at com.amazonaws.services.dynamodbv2.datamodeling.StandardModelFactories$TableBuilder.<init>(StandardModelFactories.java:123)
[junit] at com.amazonaws.services.dynamodbv2.datamodeling.StandardModelFactories$TableBuilder.<init>(StandardModelFactories.java:132)
[junit] at com.amazonaws.services.dynamodbv2.datamodeling.StandardModelFactories$TableBuilder.<init>(StandardModelFactories.java:116)
[junit] at com.amazonaws.services.dynamodbv2.datamodeling.StandardModelFactories$StandardTableFactory.getTable(StandardModelFactories.java:107)
[junit] at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper.getTableModel(DynamoDBMapper.java:410)
[junit] at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper.generateCreateTableRequest(DynamoDBMapper.java:2270)
[junit] at com.amazonaws.services.dynamodbv2.datamodeling.AbstractDynamoDBMapper.generateCreateTableRequest(AbstractDynamoDBMapper.java:339)
[junit] at com.amazon.dithreatmodelingservicelambda.tools.TestHelper.lambda$initializeDynamoDBMapper$0(TestHelper.java:31)
[junit] at com.google.common.collect.ImmutableList.forEach(ImmutableList.java:406)
[junit] at com.amazon.dithreatmodelingservicelambda.tools.TestHelper.initializeDynamoDBMapper(TestHelper.java:30)
[junit] at com.amazon.dithreatmodelingservicelambda.database.DocumentDaoTest.classSetup(DocumentDaoTest.java:26)
[junit] Caused by: com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMappingException: DocumentModel[version]; auto-generated key and ALWAYS not allowed
[junit] at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperFieldModel$Builder.build(DynamoDBMapperFieldModel.java:427)
[junit] at com.amazonaws.services.dynamodbv2.datamodeling.StandardModelFactories$TableBuilder.<init>(StandardModelFactories.java:121)
[junit]
[junit]
[junit] TEST com.amazon.dithreatmodelingservicelambda.database.DocumentDaoTest FAILED
[junit] Testsuite: com.amazon.dithreatmodelingservicelambda.database.ZonedDateTimeConverterTest
[junit] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.018 sec
[junit]
[junit] Tests FAILED
日志中最关键的错误时
"auto-generated key and ALWAYS not allowed"
在论坛中搜索后:https://forums.aws.amazon.com/message.jspa?messageID=312527 我发现AWS不建议使用@DynamoDBVersionAttribute生成的自动递增键。
为什么有 2 个相互冲突的指导,如果这里没有冲突,那么如何在使用 DynamoDBMapper 时对范围键属性启用乐观锁定?