gpt4 book ai didi

java - DynamoDB JsonMarshaller 无法反序列化对象列表

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:51:21 24 4
gpt4 key购买 nike

我有一个 Java 类,它是 DynamoDB 中表的数据模型。我想使用 DynamoDBMappersaveload来自 Dynamo 的元素。该类的一名成员是List<MyObject> .所以我用了 JsonMarshaller<List<MyObject>>序列化和反序列化该字段。

列表可以通过 JsonMarshaller 成功序列化.但是,当我尝试取回条目并读取列表时,它会抛出异常:java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to MyObject .看起来像 JsonMarshaller将数据反序列化为 LinkedHashMap而不是 MyObject .我怎样才能摆脱这个问题?

MCVE:

// Model.java
@DynamoDBTable(tableName = "...")
public class Model {
private String id;
private List<MyObject> objects;

public Model(String id, List<MyObject> objects) {
this.id = id;
this.objects = objects;
}

@DynamoDBHashKey(attributeName = "id")
public String getId() { return this.id; }
public void setId(String id) { this.id = id; }

@DynamoDBMarshalling(marshallerClass = ObjectListMarshaller.class)
public List<MyObject> getObjects() { return this.objects; }
public void setObjects(List<MyObject> objects) { this.objects = objects; }
}

// MyObject.java
public class MyObject {
private String name;
private String property;

public MyObject() { }
public MyObject(String name, String property) {
this.name = name;
this.property = property;
}

public String getName() { return this.name; }
public void setName(String name) { this.name = name; }

public String getProperty() { return this.property; }
public void setProperty(String property) { this.property = property; }
}

// ObjectListMarshaller.java
public class ObjectListMarshaller extends JsonMarshaller<List<MyObject>> {}

// Test.java
public class Test {
private static DynamoDBMapper mapper;

static {
AmazonDynamoDBClient client = new AmazonDynamoDBClient(new ProfileCredentialsProvider()
mapper = new DynamoDBMapper(client);
}

public static void main(String[] args) {
MyObject obj1 = new MyObject("name1", "property1");
MyObject obj2 = new MyObject("name2", "property2");
List<MyObject> objs = Arrays.asList(obj1, obj2);

Model model = new Model("id1", objs);
mapper.save(model); // success

Model retrieved = mapper.load(Model.class, "id1");
for (MyObject obj : retrieved.getObjects()) { // exception
}
}
}

最佳答案

在较新的版本中,只需使用:

@DynamoDBAttribute(attributeName = "things")
public List<Thing> getThings() {
return things;
}

public void setThings(final List<Thing> things) {
this.things = things;
}

鉴于 Thing 被注释为:

@DynamoDBDocument
public class Thing {
}

关于java - DynamoDB JsonMarshaller 无法反序列化对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30793481/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com