有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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_definedgetter上面使用@DynamoDBTyped(DynamoDBMapperFieldModel.DynamoDBAttributeType.M)Map而不是HashMap,但都没有用

我想了解如何将user_defined字段转换为Java HashMapMap。感谢您的帮助。谢谢!


共 (1) 个答案

  1. # 1 楼答案

    Map<String, Object>变成Map<String, String>。它应该在没有任何自定义转换器的情况下工作。否则,请明确地图的值类型。例如,Map<String, SimplePojo>应该可以工作。别忘了用@DynamoDBDocument注释SimplePojo

    将对象作为一种地图值,DynamoDB在读取DynamoDB中的条目时将无法决定必须创建哪个对象。它应该知道特定的类型,比如StringIntegerSimplePojo等等