我想创建一个具有以下功能的dynamodb
orderId
date
Y|N
<nested json structure>
第4点是我真正感到困惑的一点。如果我将details
字段保留为字符串并尝试将json
存储为字符串,则AWS 转义 "
字符,即{"onlineStore" : "283"}
变为{{1 }}
使用{\"onlineStore\": \"283\"}
作为字符串映射从dynamodb中正确检索此get,但如果我必须使用jackson将其转换为pojo,我必须处理那些details
。
作为替代方案,我认为我可以创建\
POJO ,即
details
通过上述实现,我得到public class OrderDetail{
private int onlineStore;
// rest of the JSON properties
@JsonCreator
public OrderDetail (@JsonProperty("onlineStore") int onlineStore, ...){
this.onlineStore = onlineStore;
}
}
的错误。
DynamoDBMappingException: Couldn't convert attribte
类型是我的JSON REST响应之间使用的常见类型,因此我想避免在此处放置OrderDetail
特定注释。
现在的问题是实施它的正确方法。
答案 0 :(得分:0)
如果您使用DynamoDB Mapper class执行CRUD操作,则可以使用注释@DynamoDBTypeConvertedJson
保存订单详细信息。
DynamoDBTypeConvertedJson - 查看此链接了解更多详情
DynamoDBMapper类: -
AWS SDK for Java提供了一个DynamoDBMapper类,允许您使用 将客户端类映射到DynamoDB表。使用 DynamoDBMapper,您定义一个项目之间的关系 DynamoDB表及其代码中的相应对象实例。 DynamoDBMapper类使您可以访问表,执行 各种创建,读取,更新和删除(CRUD)操作,并执行 查询。
示例实施: -
@DynamoDBTable(tableName = "Order")
public class Order implements Serializable {
private static final long serialVersionUID = -3534650012619938612L;
private String orderId;
private OrderDetail orderDetail;
@DynamoDBHashKey(attributeName = "orderId")
@DynamoDBAutoGeneratedKey
public String getOrderId() {
return orderId;
}
public void setOrderId(String orderId) {
this.orderId = orderId;
}
@DynamoDBTypeConvertedJson
public OrderDetail getOrderDetail() {
return orderDetail;
}
public void setOrderDetail(OrderDetail orderDetail) {
this.orderDetail = orderDetail;
}
}
public class OrderDetail implements Serializable {
private static final long serialVersionUID = 7312390212027563305L;
private Integer onlineStore;
public Integer getOnlineStore() {
return onlineStore;
}
public void setOnlineStore(Integer onlineStore) {
this.onlineStore = onlineStore;
}
@Override
public String toString() {
return "OrderDetail [onlineStore=" + onlineStore + "]";
}
}
public Order loadOrder(String orderId) {
DynamoDBMapper dynamoDBMapper = new DynamoDBMapper(dynamoDBClient);
Order order = dynamoDBMapper.load(Order.class, orderId,
new DynamoDBMapperConfig(DynamoDBMapperConfig.ConsistentReads.CONSISTENT));
System.out.println("Order : " + order.toString());
System.out.println("Order Id : " + order.getOrderId());
System.out.println("Order Detail : " + order.getOrderDetail());
System.out.println("Online store : " + order.getOrderDetail().getOnlineStore());
return order;
}
<强>输出: - 强>
Order Id : 0beced28-f1de-4c44-8094-6de687d25e97
Order Detail : OrderDetail [onlineStore=1]
Online store : 1
DDB中的数据: -
正如您所提到的,订单明细将与转义字符一起存储。但是,当您使用DynamoDB映射器获取数据时,它将以反序列化的形式(即作为POJO对象)。