java DynamoDBMapper UNVERT属性错误
我从dynamoDb得到的json看起来像这样-
{
"id": "1234",
"payment": {
"payment_id": "2345",
"user_defined": {
"some_id": "3456"
}
}
}
我的目标是在Java HashMap<String, Object>
中获取user_defined
字段,因为user_defined
字段可以包含任何用户定义的字段,在数据到达之前,这些字段都是未知的。除了我的DynamoDBMapper
无法将user_defined
字段转换为Java HashMap
之外,一切都正常。它抛出了这个错误-
Exception occured Response[payment]; could not unconvert attribute
这就是课程的样子-
@DynamoDBTable(tableName = "PaymentDetails")
public class Response {
private String id;
public Response() {
}
private Payment payment = new Payment();
@DynamoDBHashKey(attributeName="id")
public String getId() { return id; }
public void setId(String id) { this.id = id; }
public Payment getPayment() {
return payment;
}
public void setPayment(Payment payment) {
this.payment = payment;
}
}
支付字段映射器-
@DynamoDBDocument
public class Payment {
private String payment_id:
private HashMap<String, Object> user_defined;
public Payment() {}
public getPayment_id() {
return payment_id;
}
public setPayment_id(String payment_id) {
this.payment_id = payment_id;
}
@DynamoDBTypeConverted(converter = HashMapMarshaller.class)
public HashMap<String, Object> getUser_defined() {
return user_defined;
}
public void setUser_defined(HashMap<String, Object> user_defined) {
this.user_defined = user_defined;
}
}
HashMapMarshaller
(只是为了检查Hashmap marshaller是否与gson
一起工作,我刚刚定义了一个Hashmap
,输入一个值并返回它,但似乎仍然不工作)——
public class HashMapMarshaller implements DynamoDBTypeConverter<String, HashMap<String, Object>> {
@Override
public String convert(HashMap<String, Object> hashMap) {
return new Gson().toJson(hashMap);
}
@Override
public HashMap<String, Object> unconvert(String jsonString) {
System.out.println("jsonString received for unconverting is " + jsonString);
System.out.println("Unconverting attribute");
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put("key", "value");
return hashMap;
//return new Gson().fromJson(jsonString, new TypeToken<HashMap<String, Object>>(){}.getType());
}
}
马歇尔勒的方法到目前为止对我不起作用。它也没有打印我放在那里的任何println
。我也尝试过在我的user_defined
getter上面使用@DynamoDBTyped(DynamoDBMapperFieldModel.DynamoDBAttributeType.M)
和Map
而不是HashMap
,但都没有用
我想了解如何将user_defined
字段转换为Java HashMap
或Map
。感谢您的帮助。谢谢!
# 1 楼答案
把
Map<String, Object>
变成Map<String, String>
。它应该在没有任何自定义转换器的情况下工作。否则,请明确地图的值类型。例如,Map<String, SimplePojo>
应该可以工作。别忘了用@DynamoDBDocument
注释SimplePojo
类将对象作为一种地图值,DynamoDB在读取DynamoDB中的条目时将无法决定必须创建哪个对象。它应该知道特定的类型,比如
String
、Integer
、SimplePojo
等等