2017-07-11 2 views
0

ich eine DynamoDB erstellen möchten, die hat folgende EigenschaftenNested json Struktur

  1. PK: orderId
  2. RK: date
  3. ausgeliefert: Y|N
  4. Details: <nested json structure>

Punkt 4 ist derjenige, über den ich wirklich verwirrt bin. Wenn ich details Feld als String halten und versuchen json als Zeichenfolge zu speichern, AWS zu entkommen" Zeichen, dh, wird {"onlineStore" : "283"}{\"onlineStore\": \"283\"}

Dieses gets richtig von DynamoDB mit details als String Zuordnungen abgerufen, aber wenn ich konvertieren, um es zu ein pojo mit jackson, muss ich auf diese \ aufpassen.

So als Alternative, dachte ich, dass ich details eine POJO heißt

public class OrderDetail{ 
    private int onlineStore; 
    // rest of the JSON properties 

    @JsonCreator 
    public OrderDetail (@JsonProperty("onlineStore") int onlineStore, ...){ 
     this.onlineStore = onlineStore;   
    } 
} 

Mit der obigen Implementierung schaffen könnte, ich Fehler erhalten, dass DynamoDBMappingException: Couldn't convert attribte. Der OrderDetail Typ ist ein üblicher Typ, der auch zwischen meiner JSON REST Response verwendet wird.

Jetzt ist die Frage was sollte richtige Art sein, es zu implementieren.

Antwort

0

Wenn Sie den CRUD-Vorgang mit DynamoDB Mapper class ausführen, können Sie die Bestelldetails mit der Anmerkung @DynamoDBTypeConvertedJson speichern.

DynamoDBTypeConvertedJson - Überprüfen Sie auf diesen Link, um weitere Informationen zu

DynamoDBMapper Klasse: -

Das AWS SDK für Java eine DynamoDBMapper-Klasse bietet, so dass Sie Karte Ihre clientseitige Klassen DynamoDB Tabellen. Um den DynamoDBMapper zu verwenden, definieren Sie die Beziehung zwischen Elementen in einer DynamoDB-Tabelle und den entsprechenden Objektinstanzen in Ihrem Code. Mit der DynamoDBMapper-Klasse können Sie auf Ihre Tabellen zugreifen, verschiedene Operationen zum Erstellen, Lesen, Aktualisieren und Löschen (CRUD) ausführen und Abfragen ausführen.

Beispielimplementierung: -

@DynamoDBTable(tableName = "Order") 
public class Order implements Serializable { 

    private static final long serialVersionUID = -3534650012619938612L; 

    private String orderId; 

    private OrderDetail orderDetail; 

    @DynamoDBHashKey(attributeName = "orderId") 
    @DynamoDBAutoGeneratedKey 
    public String getOrderId() { 
     return orderId; 
    } 

    public void setOrderId(String orderId) { 
     this.orderId = orderId; 
    } 

    @DynamoDBTypeConvertedJson 
    public OrderDetail getOrderDetail() { 
     return orderDetail; 
    } 

    public void setOrderDetail(OrderDetail orderDetail) { 
     this.orderDetail = orderDetail; 
    } 

} 

public class OrderDetail implements Serializable { 

    private static final long serialVersionUID = 7312390212027563305L; 
    private Integer onlineStore; 

    public Integer getOnlineStore() { 
     return onlineStore; 
    } 

    public void setOnlineStore(Integer onlineStore) { 
     this.onlineStore = onlineStore; 
    } 

    @Override 
    public String toString() { 
     return "OrderDetail [onlineStore=" + onlineStore + "]"; 
    } 

} 

public Order loadOrder(String orderId) { 

    DynamoDBMapper dynamoDBMapper = new DynamoDBMapper(dynamoDBClient); 

    Order order = dynamoDBMapper.load(Order.class, orderId, 
      new DynamoDBMapperConfig(DynamoDBMapperConfig.ConsistentReads.CONSISTENT)); 

    System.out.println("Order : " + order.toString()); 
    System.out.println("Order Id : " + order.getOrderId()); 
    System.out.println("Order Detail : " + order.getOrderDetail()); 
    System.out.println("Online store : " + order.getOrderDetail().getOnlineStore()); 

    return order; 

} 

Ausgang: -

Order Id : 0beced28-f1de-4c44-8094-6de687d25e97 
Order Detail : OrderDetail [onlineStore=1] 
Online store : 1 

Daten in DDB: -

Wie Sie erwähnt haben, der Auftrag Detail wil Ich werde mit Escape-Zeichen gespeichert. Wenn Sie die Daten jedoch mithilfe des DynamoDB-Mappers abrufen, wird sie in deserialisierter Form vorliegen (d. H. Als POJO-Objekt).

enter image description here