2016-03-29 55 views
0

我有一個名爲'inbox'的DynamoDB表。它將存儲發送給用戶和從用戶發送的消息。將有不止一種類型的消息,並且基於類型,數據可能與消息一起出現。我有一個映射到收件箱表的對象UserMessage。雖然所有消息都會有公用字段(例如sendTo,sentFrom),但數據結構會有所不同。使用Java泛型時出現DynamoDBMappingException

與使用Map來處理這些數據相比,使用Java泛型可能是一種更好的方法。我有一個用@DynamoDBDocument註釋的對象,DynamoDBMapper會將它序列化爲JSON。當成員變量聲明爲:

private ContactData data; 

確實,結果是預期的。數據被序列化爲JSON並以ContactData的註釋格式存儲在收件箱中的數據屬性中。但是,爲了獲得使用泛型所需的靈活性,對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; 
    } 
} 

併爲聯絡人資料代碼:

@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; 
} 
} 

控制器代碼來設置這就是:

UserMessage<ContactData> message = new UserMessage<ContactData>(); 
ContactData cd = new ContactData(); 
cd.setEmail("[email protected]"); 
cd.setFirstname("Jane"); 
cd.setLastname("Smith"); 

message.setToId("[email protected]"); 
message.setData(cd) 
DynamoDB.getMapper().save(message); 

我相當沒有經驗和普通的類型對我來說都是全新的,所以我希望我能夠正確地使用它們。我覺得我是。我只是認爲在這種情況下DynamoDBMapper無法映射到正確的類。 謝謝 傑夫

回答

0

每次你使用非標準的屬性類,你需要提供一個編組。在這裏,我使用了一個全局對象編組器,您可以使用它只需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; 
     } 
    } 
}