Tôi có một lớp Java là mô hình dữ liệu của một bảng trong DynamoDB. Tôi muốn sử dụng các mục DynamoDBMapper
đến save
và load
các mục từ Dynamo. Một thành viên của lớp học là List<MyObject>
. Vì vậy, tôi đã sử dụng JsonMarshaller<List<MyObject>>
để tuần tự hóa và hủy tuần tự hóa trường này.DynamoDB JsonMarshaller không thể Deserialize Danh sách đối tượng
Danh sách có thể được sắp xếp thành công theo số JsonMarshaller
. Tuy nhiên, khi tôi cố gắng lấy lại mục nhập và đọc danh sách, nó ném một ngoại lệ: java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to MyObject
. Dường như xóa dữ liệu JsonMarshaller
thành LinkedHashMap
thay vì MyObject
. Làm thế nào tôi có thể loại bỏ vấn đề này?
Các 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
}
}
}
Làm thế nào để thợ đúc của bạn không thực hiện 'DynamoDBMarshaller'? Bạn có thể cung cấp [MCVE] (http://stackoverflow.com/help/mcve) để tạo lại ngoại lệ không? – mkobit
Đã thêm MCVE. Vì '' JsonMarshaller'' đã thực thi '' DynamoDBMarshaller'', bạn không cần thực hiện lại nó. –