Skip to content

Commit 9f3e7c7

Browse files
committed
Convert null string to null attribute value
1 parent d0e47d0 commit 9f3e7c7

File tree

5 files changed

+57
-1
lines changed

5 files changed

+57
-1
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"category": "DynamoDB Enhanced Client",
3+
"contributor": "",
4+
"type": "bugfix",
5+
"description": "Converts string to NULL attribute if it's null. See [#2243](https://github.com/aws/aws-sdk-java-v2/issues/2243)"
6+
}

services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/internal/converter/attribute/StringAttributeConverter.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import software.amazon.awssdk.enhanced.dynamodb.AttributeConverter;
3030
import software.amazon.awssdk.enhanced.dynamodb.AttributeValueType;
3131
import software.amazon.awssdk.enhanced.dynamodb.EnhancedType;
32+
import software.amazon.awssdk.enhanced.dynamodb.internal.AttributeValues;
3233
import software.amazon.awssdk.enhanced.dynamodb.internal.converter.TypeConvertingVisitor;
3334
import software.amazon.awssdk.enhanced.dynamodb.internal.converter.string.BooleanStringConverter;
3435
import software.amazon.awssdk.enhanced.dynamodb.internal.converter.string.ByteArrayStringConverter;
@@ -64,7 +65,7 @@ public AttributeValueType attributeValueType() {
6465

6566
@Override
6667
public AttributeValue transformFrom(String input) {
67-
return AttributeValue.builder().s(input).build();
68+
return input == null ? AttributeValues.nullAttributeValue() : AttributeValue.builder().s(input).build();
6869
}
6970

7071
@Override

services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/enhanced/dynamodb/converters/attribute/StringAttributeConvertersTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import org.junit.Test;
4141
import software.amazon.awssdk.core.SdkBytes;
4242
import software.amazon.awssdk.enhanced.dynamodb.AttributeValueType;
43+
import software.amazon.awssdk.enhanced.dynamodb.internal.AttributeValues;
4344
import software.amazon.awssdk.enhanced.dynamodb.internal.converter.attribute.CharSequenceAttributeConverter;
4445
import software.amazon.awssdk.enhanced.dynamodb.internal.converter.attribute.CharacterArrayAttributeConverter;
4546
import software.amazon.awssdk.enhanced.dynamodb.internal.converter.attribute.CharacterAttributeConverter;
@@ -128,6 +129,7 @@ public void stringAttributeConverterBehaves() {
128129
String chars = "foo";
129130
String numChars = "42";
130131

132+
assertThat(transformFrom(converter, null)).isSameAs(AttributeValues.nullAttributeValue());
131133
assertThat(transformFrom(converter, chars).s()).isSameAs(chars);
132134
assertThat(transformFrom(converter, emptyChars).s()).isSameAs(emptyChars);
133135

services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/enhanced/dynamodb/mapper/BeanTableSchemaTest.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -845,6 +845,35 @@ public void mapBean_stringStringMap() {
845845
assertThat(reverse, is(equalTo(mapBean)));
846846
}
847847

848+
@Test
849+
public void mapBean_mapWithNullValue() {
850+
BeanTableSchema<MapBean> beanTableSchema = BeanTableSchema.create(MapBean.class);
851+
MapBean mapBean = new MapBean();
852+
mapBean.setId("id-value");
853+
854+
Map<String, String> testMap = new HashMap<>();
855+
testMap.put("one", null);
856+
testMap.put("three", "four");
857+
858+
mapBean.setStringMap(testMap);
859+
860+
Map<String, AttributeValue> itemMap = beanTableSchema.itemToMap(mapBean, true);
861+
862+
Map<String, AttributeValue> expectedMap = new HashMap<>();
863+
expectedMap.put("one", AttributeValues.nullAttributeValue());
864+
expectedMap.put("three", stringValue("four"));
865+
AttributeValue expectedMapValue = AttributeValue.builder()
866+
.m(expectedMap)
867+
.build();
868+
869+
assertThat(itemMap.size(), is(2));
870+
assertThat(itemMap, hasEntry("id", stringValue("id-value")));
871+
assertThat(itemMap, hasEntry("stringMap", expectedMapValue));
872+
873+
MapBean reverse = beanTableSchema.mapToItem(itemMap);
874+
assertThat(reverse, is(equalTo(mapBean)));
875+
}
876+
848877
@Test
849878
public void mapBean_nestedStringMap() {
850879
BeanTableSchema<MapBean> beanTableSchema = BeanTableSchema.create(MapBean.class);

services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/enhanced/dynamodb/mapper/StaticTableSchemaTest.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1216,6 +1216,24 @@ public void mapperCanHandleGenericMap() {
12161216
AttributeValue.builder().m(attributeValueMap).build());
12171217
}
12181218

1219+
@Test
1220+
public void mapperCanHandleMapWithNullValue() {
1221+
Map<String, String> stringMap = new HashMap<>();
1222+
stringMap.put("one", null);
1223+
stringMap.put("two", "three");
1224+
1225+
Map<String, AttributeValue> attributeValueMap = new HashMap<>();
1226+
attributeValueMap.put("one", AttributeValue.builder().nul(true).build());
1227+
attributeValueMap.put("two", AttributeValue.builder().s("three").build());
1228+
1229+
verifyNullableAttribute(EnhancedType.mapOf(String.class, String.class),
1230+
a -> a.name("value")
1231+
.getter(FakeMappedItem::getAStringMap)
1232+
.setter(FakeMappedItem::setAStringMap),
1233+
FakeMappedItem.builder().aStringMap(stringMap).build(),
1234+
AttributeValue.builder().m(attributeValueMap).build());
1235+
}
1236+
12191237
@Test
12201238
public void mapperCanHandleIntDoubleMap() {
12211239
Map<Integer, Double> intDoubleMap = new ConcurrentHashMap<>();

0 commit comments

Comments
 (0)