2017-10-03 1 views
0

Ich versuche, Daten in DynamoDb zu speichern, aber diese Daten enthalten auch einige Map-Attribute. Aber ich erhalte Fehler beim Speichern dieser Daten. Folgende ist meine Domain-Klasse, die ich für das Speichern von Daten aus Anfrage bin mit:DynamoDb kann keine Kartendaten speichern (Java)

@DynamoDBTable(tableName = "ottMiddleware_rails") 
public class RailsCmsDomain { 

@DynamoDBHashKey(attributeName = "railId") 
private String railId; 

@DynamoDBTyped 
@DynamoDBAttribute(attributeName = "railLogic") 
private Map<String, Object> railLogic; 

@DynamoDBAttribute(attributeName = "railSourceType") 
private String railSourceType; 

@DynamoDBAttribute(attributeName = "railTitle") 
private RailCmsTitleDomain railTitle; 

@DynamoDBTyped 
@DynamoDBAttribute(attributeName = "restrictions") 
private Map<String, Object> restrictions; 

ich folgende Anfrage gebe:

{ 
"railId": "railOne", 
"railLogic": { 
"programType": 1, 
"railSourceUrl": "http://myUrl" 
}, 
"railSourceType": "myRail", 
"railTitle": { 
"tam": "Raan Phan", 
"def": "சிறப்பு கட்டமைப்பு" 
}, 
"restrictions": { 
"clients": [ 
    "abc", 
    "xyz" 
], 
"periodStart": 1506572217 
} 
} 

ich verwende folgenden Code meine Daten in die DynamoDB

zu sparen
public Boolean saveUpdateRailsDetails(RailsCmsDomain railsDomain) { 
    DynamoDBUtil dynamoDBUtil = new DynamoDBUtil(); 
    AmazonDynamoDB dynamoDBClient = dynamoDBUtil.getDynamoDBClient(); 
    DynamoDBMapper mapper = new DynamoDBMapper(dynamoDBClient); 
    mapper.save(railsDomain); 
    return true; 
} 

Bitte schlagen Sie vor, wie kann ich Karte in dynamoDb speichern. Ich nehme Daten als Karte, weil in späteren Phasen die Wahrscheinlichkeit besteht, dass den Attributen, die eine Karte sind, mehr Daten hinzugefügt werden können und dass Daten von jedem Datentyp sein können. Ich erhalte folgende Fehlermeldung:

errorMessage": "not supported; requires @DynamoDBTyped or 
@DynamoDBTypeConverted" 
"errorType": 
"com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMappingException" 
+0

Das Problem liegt in der Restriktionsattributdefinition. Welche Art von Daten enthält es außer Client?Das Problem könnte die Attributdaten nicht konvertieren, wenn es als Map definiert ist. – notionquest

+0

Einschränkungen enthalten periodStart, die vom Typ lang ist –

+0

ok, warum definieren Sie nicht die Einschränkungen ähnlich wie RailTitle mit benutzerdefinierten Klassendefinition? – notionquest

Antwort

0

Das Problem ist, dass die DynamoDB Mapper nicht weiß, wie man marshall/unmarshall die Object in dieser Zeile:

private Map<String, Object> railLogic; 

Wenn Sie nicht wollen, ändern Object bis String, verwenden Sie dann die DynamoDBTypeConverted Annotation, um einen benutzerdefinierten Marshaller für Map<String, Object> bereitzustellen, den Sie dann (wahrscheinlich) für restrictions wiederverwenden können. Relevante Dokumentation here.

+0

ist Aber ich stecke in einem Szenario: Ich werde benutzerdefinierte Marshaller für Map aber dann kann In diesem Fall muss ich später, wenn ich der railLogic einige weitere Attribute hinzufügen muss, jedes Mal Änderungen in der benutzerdefinierten Marshaller-Klasse vornehmen. Kann es keine Lösung geben, wo in späteren Stadien, ob ich Anfrage als String oder List in Map Object Wert sende, sie beide gespeichert werden? Als Objekt kann alles entweder Liste oder String oder irgendetwas anderes sein. –

+0

Nicht wirklich. Der benutzerdefinierte Marshaller muss geändert werden, um alle möglichen Fälle von "Objekt" zu behandeln. –

+0

Ich denke für einen anderen Ansatz, was passiert, wenn ich die gesamte JSON-Anfrage als solche in DynamoDb speichern, ohne sie in eine Zeichenfolge zu konvertieren. Ist es machbar? –

0

Ich möchte diese Antwort als eine Option veröffentlichen, obwohl es nicht die Daten als Karte in DynamoDB speichern wird. Es wird jedoch den Fehler beheben.

Sie können das Attribut restrictions wie unten angegeben definieren. Es speichert die Daten als JSON-Zeichenfolge in DynamoDB.

@DynamoDBTypeConvertedJson 
private Map<String, Object> restrictions; 

Nachteile: -

Wenn Sie das restrictions Attribut aktualisieren möchten, müssen Sie den aktuellen Wert aus der Datenbank erhalten, aktualisieren und die Daten in der Datenbank zu speichern.

DynamoDB Daten: -

restrictions Attribut als JSON-String gespeichert.

enter image description here

1

Wenn I benötigen Karte in DynamoDB speichern I kommentierte nur die Getter-Methode der Karte mit dem @DynamoDBTypeConverted (Konverter = MapConverter.class) und in dem Konverter serialisiert nur die Karte in einen json string, diese So können Sie die Karte und alles abrufen, aber nicht in der Lage sein, es in QueryExpressions zu verwenden, wenn Sie benötigen.

Wenn Sie in der Lage sein möchten, die Objekte in der Map abzufragen, können Sie das Objekt, das Sie in Ihrer Map verwenden, mit @DynamoDBDocument annotieren. Auf diese Weise wird es automatisch von dynamobb als Dokument serialisiert und stattdessen Set verwendet der Karte in Ihr Elternobjekt.

Verwandte Themen