aws / aws/aws-sdk-java-v2

DefaultStringConverterProvider can't convert Map with Enum as a key

Offen
#2,102 5 Kommentare 7 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen
dynamodb-enhanced feature-request p3
Vorherrschende Sprache
Java
Sterne
2.6k
Forks
1k
Ø Merge
2 T. 9 Std.
Gemergte PRs (30 T.)
51

Beschreibung

Mapping of the `Map` where `K` is enum doesn't work.

Example entity:

```
@DynamoDbBean
@Data
public class TestClass {

@DynamoDbPartitionKey
private String id;
private Map map;

public enum Status {
ONE, TWO
}
}
```

Example `TableSchema`

```
private TableSchema 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.(StaticImmutableTableSchema.java:159)
at software.amazon.awssdk.enhanced.dynamodb.mapper.StaticImmutableTableSchema.(StaticImmutableTableSchema.java:77)
at software.amazon.awssdk.enhanced.dynamodb.mapper.StaticImmutableTableSchema$Builder.build(StaticImmutableTableSchema.java:425)
at software.amazon.awssdk.enhanced.dynamodb.mapper.StaticTableSchema.(StaticTableSchema.java:66)
at software.amazon.awssdk.enhanced.dynamodb.mapper.StaticTableSchema.(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.(DynamoDbTestConfiguration.java:22)
at test.DynamoDbTestConfiguration$$EnhancerBySpringCGLIB$$9f051cd1.()
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 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

Beitragsleitfaden

Beitragsleitfaden öffnen

Rechercherichtung

Beginne mit DefaultStringConverterProvider.java:155 und DefaultAttributeConverterProvider.java:133-182 und reproduziere dann den Fehler mit TableSchema.fromBean(TestClass.class) unter Verwendung von Map. Vergleiche dies mit dem funktionierenden Fall Map; abgeschlossen ist die Aufgabe, wenn eine Bean mit einer Map mit Enum-Schlüsseln ohne die gemeldete IllegalArgumentException gemappt werden kann.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
java
Bereich
databases
Issue-Typ
Bug
Schwierigkeit
3/5
Geschätzter Aufwand
1-2 Tage
Aktivitätsstatus
Veraltet
Klarheit
Klar beschrieben
Anfängerfreundlichkeit
38/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.