aws / aws/aws-sdk-java-v2

DefaultStringConverterProvider can't convert Map with Enum as a key

オープン
#2,102 コメント 5 件 リアクション 7 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

dynamodb-enhanced feature-request p3
主要言語
Java
スター
2.6k
フォーク
1k
平均マージ
2日 9時間
マージ済み PR(30日)
51

説明

Mapping of the Map<K,String> where K is enum doesn't work.

Example entity:

@DynamoDbBean
@Data
public class TestClass {

    @DynamoDbPartitionKey
    private String id;
    private Map<Status, String> map;
   
    public enum Status {
         ONE, TWO
     }
}

Example TableSchema

private TableSchema<TestClass> tableSchema = TableSchema.fromBean(TestClass.class);

Describe the bug

Mapping doesn't work.

Expected Behavior

Mapping works.

Current Behavior

It fails with the following error:

Caused by: java.lang.IllegalArgumentException: No string converter exists for class test.TestClass.Status

Full stacktrace:

Caused by: java.lang.IllegalArgumentException: No string converter exists for class test.TestClass.Status
	at software.amazon.awssdk.enhanced.dynamodb.internal.converter.string.DefaultStringConverterProvider.converterFor(DefaultStringConverterProvider.java:155)
	at software.amazon.awssdk.enhanced.dynamodb.DefaultAttributeConverterProvider.createMapConverter(DefaultAttributeConverterProvider.java:182)
	at software.amazon.awssdk.enhanced.dynamodb.DefaultAttributeConverterProvider.findConverter(DefaultAttributeConverterProvider.java:149)
	at software.amazon.awssdk.enhanced.dynamodb.DefaultAttributeConverterProvider.converterFor(DefaultAttributeConverterProvider.java:133)
	at software.amazon.awssdk.enhanced.dynamodb.mapper.ImmutableAttribute.converterFrom(ImmutableAttribute.java:167)
	at software.amazon.awssdk.enhanced.dynamodb.mapper.ImmutableAttribute.resolve(ImmutableAttribute.java:163)
	at software.amazon.awssdk.enhanced.dynamodb.mapper.StaticImmutableTableSchema.lambda$new$0(StaticImmutableTableSchema.java:153)
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
	at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1624)
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
	at java.base/java.util.stream.StreamSpliterators$WrappingSpliterator.forEachRemaining(StreamSpliterators.java:312)
	at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:734)
	at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:658)
	at software.amazon.awssdk.enhanced.dynamodb.mapper.StaticImmutableTableSchema.<init>(StaticImmutableTableSchema.java:159)
	at software.amazon.awssdk.enhanced.dynamodb.mapper.StaticImmutableTableSchema.<init>(StaticImmutableTableSchema.java:77)
	at software.amazon.awssdk.enhanced.dynamodb.mapper.StaticImmutableTableSchema$Builder.build(StaticImmutableTableSchema.java:425)
	at software.amazon.awssdk.enhanced.dynamodb.mapper.StaticTableSchema.<init>(StaticTableSchema.java:66)
	at software.amazon.awssdk.enhanced.dynamodb.mapper.StaticTableSchema.<init>(StaticTableSchema.java:64)
	at software.amazon.awssdk.enhanced.dynamodb.mapper.StaticTableSchema$Builder.build(StaticTableSchema.java:255)
	at software.amazon.awssdk.enhanced.dynamodb.mapper.BeanTableSchema.createStaticTableSchema(BeanTableSchema.java:200)
	at software.amazon.awssdk.enhanced.dynamodb.mapper.BeanTableSchema.create(BeanTableSchema.java:124)
	at software.amazon.awssdk.enhanced.dynamodb.mapper.BeanTableSchema.create(BeanTableSchema.java:116)
	at software.amazon.awssdk.enhanced.dynamodb.TableSchema.fromBean(TableSchema.java:80)
	at test.DynamoDbTestConfiguration.<init>(DynamoDbTestConfiguration.java:22)
	at test.DynamoDbTestConfiguration$$EnhancerBySpringCGLIB$$9f051cd1.<init>(<generated>)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481)
	at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:204)
	... 111 more

If I swap Map key and value:

@DynamoDbBean
@Data
public class TestClass {

    @DynamoDbPartitionKey
    private String id;
    private Map<String, Status> map;
   
    public enum Status {
         ONE, TWO
     }
}

it works!

Steps to Reproduce

Follow the steps above.

Possible Solution

Support Enum as a key in a Map.

Context

I am trying to save a map with enum as key.

Your Environment

  • AWS Java SDK version used: 2.15.2
  • JDK version used: 14
  • Operating System and version: MacOS 10.15.7

Related to the comment https://github.com/aws/aws-sdk-java-v2/issues/35#issuecomment-606159193

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

調査の方向性

DefaultStringConverterProvider.java:155 と DefaultAttributeConverterProvider.java:133-182 から始め、Map<Status, String> を使って TableSchema.fromBean(TestClass.class) で失敗を再現します。動作する Map<String, Status> のケースと比較します; enum をキーとする map を含む bean を、報告されている IllegalArgumentException なしでマッピングできれば完了です。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
java
領域
databases
issue の種類
バグ
難易度
3/5
見積もり時間
1〜2日
活発さ
停滞
明瞭さ
明確に書かれている
初心者へのやさしさ
38/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。