使用gson反序列化DynamoDBResults失败

时间:2016-11-01 20:15:27

标签: java-8 gson

我有一个特定的用例,我将我的一个表中的结果存储在DynamoDB中,以序列化的方式存储在另一个DynamoDB中。 现在,当我使用gson反序列化正在检索的数据时 我收到这个错误:

awk -F/ '{print $2}' | xargs mkdir

我的方法如下:

java.lang.RuntimeException: Unable to invoke no-args constructor for class java.nio.ByteBuffer. Register an InstanceCreator with Gson for this type may fix this problem.
        at com.google.gson.internal.ConstructorConstructor$12.construct(ConstructorConstructor.java:210)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:186)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:103)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:196)
        at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:40)
        at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.read(MapTypeAdapterFactory.java:187)
        at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.read(MapTypeAdapterFactory.java:145)
        at com.google.gson.Gson.fromJson(Gson.java:810)
        at com.google.gson.Gson.fromJson(Gson.java:775)

检索记录的方法如下所示:

public void store(MyCustomObject obj) {
String primaryKey = obj.getKey();

List<Map<String, AttributeValue>> results = AmazonDynamoDB.query(...).getItems();
Gson gson = new Gson();
List<String>records = results .stream()
            .map(mappedResult-> gson.toJson(mappedResult))
            .collect(Collectors.toList());

Map<String, AttributeValue> attributeMap = transformToAttributeMap(records);
PutItemRequest putItemRequest = new PutItemRequest().withItem(attributeMap);
AmazonDynamoDB.putItem(...);
}

我做错了什么?

2 个答案:

答案 0 :(得分:0)

问题是AttributeValue类有一个名为java.nio.ByteBuffer的字段b。 Gson尝试将数据反序列化为它,但ByteBuffer类没有默认构造函数。因此gson无法反序列化b字段。

另一种解决方案是使用AWS SDK的新DynamoDB。以下示例应该有效:

AmazonDynamoDBClient client = new AmazonDynamoDBClient(
        new ProfileCredentialsProvider());
Item item = new DynamoDB(client).getTable("user").getItem("Id", "user1");
String json = item.toJSON();
Item deserialized = Item.fromJSON(json);

您应该根据您的设置修改凭据提供程序。

答案 1 :(得分:0)

不完全是最好的解决方法/答案,但我能够做到这一点:

Item item = new Item().withJSON("document", jsonStr);
    Map<String,AttributeValue> attributes = InternalUtils.toAttributeValues(item);
    return attributes.get("document").getM();