2016-05-09 15 views
2

私は最初のDynamoDBプロジェクトを開始しています。できるだけドキュメントを読み込もうとしています。私のプロジェクトでは、SDKのHigh Level DynamoDbMapperを使用してCRUD操作を可能にすることが最善の方法だと思います。このようなのgetItem、又はgetItemBatchような低レベルのJava APIここ http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_AttributeValue.htmlJava DynamoDBMapper。マッピング属性値 'M'

見られる属性値のタイプ「M」は、存在するDynamoDBのドキュメントの

、この値のタイプは、Javaに変換。 util.map <>。

しかし、このデータ型を使用するためにHigherLevel DBMapperを使用することができるリソースを見つけることができないようです。サポートされるデータ型はここにあります。 http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.DataTypes.html

私はページの下部に気付きました。これは、独自のより高いレベルのマッピングシステムを作成するためのいくつかの洞察を与えます。しかし、私はコードを試してみる前にまずここで尋ねると思いました。ですから私の質問は... DynamoDBMapperをJava.Util.Mapデータ型で使用するにはどうしますか?

私がGoogleで見つけた唯一の洞察は、ユーザーが一見しているように見えている奇妙なギター・エラーだった。 https://github.com/aws/aws-sdk-java/issues/520

希望はこれが理にかなっています。 ラルフ

+0

あなたはこれを理解しましたか? – BinaryShrub

答えて

1

UPDATE:あなたはDynamoDBのマップ属性にJava.Util.Mapプロパティをマッピングする必要があると気づいたので、下記のすべてがあなたの質問に答えていません、申し訳ありません。私の場合、Java.Util.Mapクラスのプロパティではなく、カスタムクラスのプロパティが使用されます。


あなたのテーブルには、「my_tableに」名前を持ち、そして次は、レコードのJSONダンプであると仮定したとします

(ここでmy_map「M」タイプの目的のフィールドである)

{ 
    uuid: "52f9d257-7998-4379-928b-9d41d70dd8a8", 
    my_map: { 
    field1: 123, 
    field2: 456 
    } 
} 

あなたは2つの注釈付きクラス、テーブル自体のための最初のものを作成する必要があり、このようなテーブルのためDynamoDBMapperを使用するには

import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAttribute; 
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey; 
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable; 

@DynamoDBTable(tableName="my_table") 
public class MyClass { 
    private String uuid; 
    private MyMapClass myMap; 

    @DynamoDBHashKey(attributeName="uuid") 
    public String getUuid() { 
     return uuid; 
    } 
    public void setUuid(String uuid) { 
     this.uuid = uuid; 
    } 

    @DynamoDBAttribute(attributeName = "my_map")  
    public MyMapClass getMyMap() { 
     return myMap; 
    } 
    public void setMyMap(MyMapClass myMap) { 
     this.myMap = myMap; 
    }  
} 

2つ目 - my_mapフィールド用:

... 
DynamoDBMapper dbMapper = new DynamoDBMapper(dbClient); 
... 
MyClass item = new MyClass(); 
item.setUuid("52f9d257-7998-4379-928b-9d41d70dd8a8"); 
MyMapClass map = new MyMapClass(); 
map.setField1(123); 
map.setField2(456); 
item.setMyMap(map); 
dbMapper.save(item); 

・ホープ、このことができます:ここで

import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAttribute; 
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBDocument; 


@DynamoDBDocument 
public class MyMapClass { 
    private int field1; 
    private int field2; 

    @DynamoDBAttribute(attributeName = "field1")  
    public int getField1() { 
     return field1; 
    } 
    public void setField1(int field1) { 
     this.field1 = field1; 
    } 

    @DynamoDBAttribute(attributeName = "field2")  
    public int getField2() { 
     return field2; 
    } 
    public void setField2(int field2) { 
     this.field2 = field2; 
    } 
} 

は使用例です!

0

少し古い投稿ですが、ここで私の経験に答える価値があると思います。 DynamoDB Mapで気づいたのは、Stringをキーとしてマップをサポートしていることです。 hereが説明したように、あなたがConversionSchemas.V2として変換スキーマと(それが動作するはずマップしているのであれば(基本的には以下のようなあなたのDynamoDBのマッパーを作成 -

DynamoDBMapper dbMapper = new DynamoDBMapper(dbClient, DynamoDBMapperConfig.DEFAULT); 

今、このマップの値一部がサポートDynamoDBのデータ型でなければなりませんあまりにも、それは数字、文字列などを持つことができることを意味します

文字列としてキー(および/または値)がない場合は、独自のコンバーターを作成する必要があります。 Mapをキーとして使用してLocalDateで使用したコンバータの例を次に示します。

public class LocalDateMapConverter implements DynamoDBTypeConverter< Map<String, Long>, Map<LocalDate, Long>> { 
@Override 
public Map<String, Long> convert(Map<LocalDate, Long> localDateToStringMap) { 
    return localDateToStringMap.entrySet() 
      .stream() 
      .collect(toMap(k -> k.getKey().toString(), 
        Map.Entry::getValue)); 
} 

@Override 
public Map<LocalDate, Long> unconvert(Map<String, Long> stringToLocalDateMap) { 
    return stringToLocalDateMap.entrySet() 
      .stream() 
      .collect(toMap(k -> LocalDate.parse(k.getKey()), 
        Map.Entry::getValue)); 
} 
} 



@DynamoDBTable(tableName = "someTable") 
public class SomeTable { 

@DynamoDBHashKey(attributeName = "someKey") 
    private String key; 

@DynamoDBAttribute(attributeName = "someMapName") 
    @DynamoDBTypeConverted(converter = LocalDateMapConverter.class) 
    private Map<LocalDate, Long> someMap; 

} 

希望します。