DATACASS-652 - Fix enum materialization through ordinal values.

We now consider the value type that is used to materialize an enum value. Previously, all values were converted to String and attempted to load through the name.
This commit is contained in:
Mark Paluch
2019-05-05 17:49:30 +02:00
parent f4d3c336e8
commit 268ef6cccf
2 changed files with 32 additions and 26 deletions

View File

@@ -917,6 +917,12 @@ public class MappingCassandraConverter extends AbstractCassandraConverter
}
if (Enum.class.isAssignableFrom(target)) {
if (value instanceof Number) {
int ordinal = ((Number) value).intValue();
return target.getEnumConstants()[ordinal];
}
return Enum.valueOf((Class<Enum>) target, value.toString());
}

View File

@@ -16,7 +16,6 @@
package org.springframework.data.cassandra.core.convert;
import static org.assertj.core.api.Assertions.*;
import static org.junit.Assume.*;
import static org.springframework.data.cassandra.core.mapping.BasicMapId.*;
import static org.springframework.data.cassandra.test.util.RowMockUtil.*;
@@ -33,14 +32,22 @@ import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.util.*;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.springframework.core.SpringVersion;
import org.springframework.core.convert.ConverterNotFoundException;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.ReadOnlyProperty;
import org.springframework.data.annotation.Transient;
@@ -118,36 +125,29 @@ public class MappingCassandraConverterUnitTests {
assertThat(getValues(insert)).contains("MINT");
}
@Test // DATACASS-260
public void insertEnumDoesNotMapToOrdinalBeforeSpring43() {
assumeTrue(Version.parse(SpringVersion.getVersion()).isLessThan(VERSION_4_3));
expectedException.expect(ConverterNotFoundException.class);
UnsupportedEnumToOrdinalMapping unsupportedEnumToOrdinalMapping = new UnsupportedEnumToOrdinalMapping();
unsupportedEnumToOrdinalMapping.setAsOrdinal(Condition.MINT);
Insert insert = QueryBuilder.insertInto("table");
mappingCassandraConverter.write(unsupportedEnumToOrdinalMapping, insert);
}
@Test // DATACASS-255
public void insertEnumMapsToOrdinalWithSpring43AndHiger() {
public void insertEnumMapsToOrdinal() {
assumeTrue(Version.parse(SpringVersion.getVersion()).isGreaterThanOrEqualTo(VERSION_4_3));
UnsupportedEnumToOrdinalMapping unsupportedEnumToOrdinalMapping = new UnsupportedEnumToOrdinalMapping();
unsupportedEnumToOrdinalMapping.setAsOrdinal(Condition.USED);
EnumToOrdinalMapping enumToOrdinalMapping = new EnumToOrdinalMapping();
enumToOrdinalMapping.setAsOrdinal(Condition.USED);
Insert insert = QueryBuilder.insertInto("table");
mappingCassandraConverter.write(unsupportedEnumToOrdinalMapping, insert);
mappingCassandraConverter.write(enumToOrdinalMapping, insert);
assertThat(getValues(insert)).contains((Object) Integer.valueOf(Condition.USED.ordinal()));
}
@Test // DATACASS-255, DATACASS-652
public void selectEnumMapsToOrdinal() {
rowMock = RowMockUtil.newRowMock(column("asOrdinal", 1, DataType.cint()));
EnumToOrdinalMapping loaded = mappingCassandraConverter.read(EnumToOrdinalMapping.class, rowMock);
assertThat(loaded.getAsOrdinal()).isEqualTo(Condition.USED);
}
@Test // DATACASS-260
public void insertEnumAsPrimaryKeyShouldMapToString() {
@@ -1064,7 +1064,7 @@ public class MappingCassandraConverterUnitTests {
}
@Table
public static class UnsupportedEnumToOrdinalMapping {
public static class EnumToOrdinalMapping {
@PrimaryKey private String id;