@DynamoDBDocumentを使用してList<CustomObject>
を保存しようとしていますが、DynamoDBMappingExceptionが発生します:属性を変換解除できませんでした。
これが私のエンティティクラスの外観です-
@lombok.Data
@DynamoDBTable(tableName = "carTable")
public class Car {
@DynamoDBHashKey(attributeName = "name")
private carName;
@DynamoDBRangeKey(attributeName = "model")
private carModel;
@DynamoDBAttribute(attributeName = "manufacturers")
private List<Manufacturer> manufacturers;
}
Manufacturerクラスは次のようになります-
@lombok.Data
@DynamoDBDocument
public class Manufacturer {
@DynamoDBAttribute
private String manufacturerName;
}
このエンティティを使用して値をテーブルに保存すると、JSONとして適切に保存されますが、取得すると例外がスローされます-
com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMappingException: Car[manufacturers]; could not unconvert attribute
at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperTableModel.unconvert(DynamoDBMapperTableModel.Java:271)
[junit] at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper.privateMarshallIntoObject(DynamoDBMapper.Java:456)
[junit] at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper.load(DynamoDBMapper.Java:422)
[junit] at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper.load(DynamoDBMapper.Java:433)
[junit] at com.amazonaws.services.dynamodbv2.datamodeling.AbstractDynamoDBMapper.load(AbstractDynamoDBMapper.Java:85)
ここで何が欠けていますか?ここに何らかのTypeConverterまたはMarshallerを追加する必要がありますか?
属性の変換を解除するには、引数なしのコンストラクターが必要でした。@ lombok.NoArgsConstructorをManufacturerクラスに追加すると、問題が解決しました。
私の場合、問題はセッターが見つからなかったことでした
これは、@ Builderアノテーションと@GetterアノテーションのみでLombokを使用していたためです。
ここではカスタムコンバーターは必要ないと思います。DynamoDBにはDynamoDBアイテムをJavaオブジェクトに変換する際に問題があるようです。
小切手:
DynamoDBのデータはオブジェクトフィールドと一致します。タイプも一致しているかどうかを確認します
セッターを明示的に定義するとどうなりますか?たぶんロンボクはここの犯人ですか?
また、ここでテーブル名を指定しないのは奇妙です。
@DynamoDBTable(tableName)
public class Car {
...
}
@Builderを使用する場合でも、@ Tolerateを使用してデフォルトのコンストラクターを追加できます
私の場合、私のJavaクラスには文字列としての属性がありましたが、dynamodbはそれを数値として格納していました。属性をintstringの代わりに、スムーズに機能しました。