web-dev-qa-db-ja.com

変換解除できず、@ DynamoDBDocumentを使用して保存された、タイプList <Object>の属性のため、DynamoDBからデータをロードできません

@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を追加する必要がありますか?

6

属性の変換を解除するには、引数なしのコンストラクターが必要でした。@ lombok.NoArgsConstructorをManufacturerクラスに追加すると、問題が解決しました。

7

私の場合、問題はセッターが見つからなかったことでした

これは、@ Builderアノテーションと@GetterアノテーションのみでLombokを使用していたためです。

1
Rahul Midha

ここではカスタムコンバーターは必要ないと思います。DynamoDBにはDynamoDBアイテムをJavaオブジェクトに変換する際に問題があるようです。

小切手:

  • DynamoDBのデータはオブジェクトフィールドと一致します。タイプも一致しているかどうかを確認します

  • セッターを明示的に定義するとどうなりますか?たぶんロンボクはここの犯人ですか?

また、ここでテーブル名を指定しないのは奇妙です。

@DynamoDBTable(tableName)
public class Car {
...
}
1
Ivan Mushketyk

@Builderを使用する場合でも、@ Tolerateを使用してデフォルトのコンストラクターを追加できます

0
Sichen Zhao

私の場合、私のJavaクラスには文字列としての属性がありましたが、dynamodbはそれを数値として格納していました。属性をintstringの代わりに、スムーズに機能しました。

0
HelpMatters