gpt4 book ai didi

java - 使用 Java 泛型时出现 DynamoDBMappingException

转载 作者:太空宇宙 更新时间:2023-11-04 12:46:17 27 4
gpt4 key购买 nike

我有一个名为“inbox”的 DynamoDB 表。其中将存储发送给用户和从用户发送的消息。将有不止一种类型的消息,并且根据类型,数据可能与消息一起出现。我有一个对象 UserMessage 映射到收件箱表。虽然所有消息都有公共(public)字段(例如 sendTo、sentFrom),但数据的结构会有所不同。

与使用 Map 来存储这些数据相比,使用 Java 泛型可能是更好的方法。我有一个用 @DynamoDBDocument 注释的对象,DynamoDBMapper 会将其序列化为 JSON。当成员变量声明为:

private ContactData data;

确实,这个结果是预料之中的。数据被序列化为JSON并以ContactData的注释格式存储在inbox的data属性中。但是,为了通过使用泛型类型获得所需的灵 active ,对 DynamoDBMapper.save() 的调用会抛出 DynamoDBMappingException:无法将 T 转换为类。

这是 UserMessage 类:

@DynamoDBTable(tableName="inbox")
public class UserMessage<T> {

private String toId;
private T data;

@DynamoDBAttribute(attributeName="data")
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
@DynamoDBHashKey(attributeName="toId")
public String getToId() {
return toId;
}
public void setToId(String to) {
this.toId = to;
}
}

ContactData 的代码:

@DynamoDBDocument
public class ContactData {

private String firstname;
private String lastname;
private String email;

@DynamoDBAttribute(attributeName = "firstname")
public String getFirstname() {
return firstname;
}
public void setFirstname(String firstname) {
this.firstname = firstname;
}
@DynamoDBAttribute(attributeName = "lastname")
public String getLastname() {
return lastname;
}
public void setLastname(String lastname) {
this.lastname = lastname;
}
@DynamoDBAttribute(attributeName = "email")
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}

进行此设置的 Controller 代码是:

UserMessage<ContactData> message = new UserMessage<ContactData>();
ContactData cd = new ContactData();
cd.setEmail("jane@test.com");
cd.setFirstname("Jane");
cd.setLastname("Smith");

message.setToId("test@email.com");
message.setData(cd)
DynamoDB.getMapper().save(message);

我相当缺乏经验,泛型类型对我来说是全新的,所以我希望我正确使用它们。我觉得我是。我只是认为 DynamoDBMapper 在这种情况下无法映射到正确的类。谢谢杰夫

最佳答案

每次使用非标准属性类时,您都需要提供一个编码器。在这里,我使用了一个全局对象编码器,您可以使用它来JSON-ify任何您想要的东西。

我个人更喜欢使用静态类型,每个类型都有一个我可以推理的定义的编码器,但是 ymmv。

public class GenericDBEntity<T>
{
..
private T extra;

@DynamoDBAttribute
@DynamoDBMarshalling(marshallerClass=ObjectMarshaller.class)
public T getExtra()
{
return extra;
}
public void setExtra(T extra)
{
this.extra = extra;
}

public static class ObjectMarshaller implements DynamoDBMarshaller<Object>
{
@Override
public String marshall(Object getterReturnResult)
{
return getterReturnResult.toString();
}

@Override
public Object unmarshall(Class<Object> clazz, String obj)
{
return obj;
}
}
}

关于java - 使用 Java 泛型时出现 DynamoDBMappingException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36294828/

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