您可以使用如上所述的继承概念。 DynamoDBMapper save() 方法应该能够成功保存 Dog 和 Cat。
但是,当您使用 DynamoDBMapper load() 检索数据时,您需要提供正确的类名。
使用 Animal.class 执行 load() 方法时,如果 Animal 类定义为抽象类,API 将抛出“Failed to instantiate class”异常。
获取动物数据的示例 load() 方法:-
dynamoDBMapper.load(Animal.class,id,
new DynamoDBMapperConfig(DynamoDBMapperConfig.ConsistentReads.CONSISTENT));
例外:-
Caused by: com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMappingException: Failed to instantiate class
解决方法 1:-
您可以使用 QuerySpec 获取 Animal 数据。这样做的缺点是您需要单独获取每个键的值,因为您没有使用 DynamoDBMapper 类获取数据。
DynamoDB dynamoDB = new DynamoDB(dynamoDBClient);
Table table = dynamoDB.getTable("Animals");
ItemCollection<QueryOutcome> items = null;
QuerySpec querySpec = new QuerySpec();
querySpec.withKeyConditionExpression("Id = :val1").withValueMap(new ValueMap().withString(":val1", animalId));
items = table.query(querySpec);
Iterator<Item> iterator = items.iterator();
while (iterator.hasNext()) {
Item itemData = iterator.next();
System.out.println("Json data ====================>" + itemData.toJSONPretty());
System.out.println("Dogname : " + itemData.getString("dogname"));
System.out.println("Catname : " + itemData.getString("catname"));
}
解决方法 2:-
您可以将 Animal 类声明为普通类(即没有抽象)。在这种方法中,您可以使用 DynamoDBMapper 获取数据。但是,您不会看到子类属性。
如果您知道要获取 CAT 或 DOG 对象,则可以在 load() 期间将其指定为相应的类名。
当你得到狗时:-
Dog dog = dynamoDBMapper.load(Dog.class, id,
new DynamoDBMapperConfig(DynamoDBMapperConfig.ConsistentReads.CONSISTENT));
获得 CAT 后:-
Cat cat = dynamoDBMapper.load(Cat.class, id,
new DynamoDBMapperConfig(DynamoDBMapperConfig.ConsistentReads.CONSISTENT));