From f156d7b5af4df4b9310dcc5a1aedc6fcec6ce460 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Wed, 23 Nov 2011 11:58:09 +0100 Subject: [PATCH] DATAMONGO-312 - MappingMongoConverter handles complex enum types correctly. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If an Enum implements abstract methods, the Class object derived from ${ENUM}.getClass() does not return true for ….isEnum(). Thus we have to rather check Enum.class.isAssignableFrom(…) as this catches this scenario as well. Also see DATACMNS-99 for a related fix in simple type handling in the core infrastructure. --- .../core/convert/MappingMongoConverter.java | 4 +-- .../MappingMongoConverterUnitTests.java | 28 +++++++++++++------ 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java index db18f3f36..b82f91fac 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java @@ -653,7 +653,7 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App if (customTarget != null) { return conversionService.convert(value, customTarget); } else { - return value.getClass().isEnum() ? ((Enum) value).name() : value; + return Enum.class.isAssignableFrom(value.getClass()) ? ((Enum) value).name() : value; } } @@ -676,7 +676,7 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App return conversionService.convert(value, target); } - if (target.isEnum()) { + if (Enum.class.isAssignableFrom(target)) { return Enum.valueOf((Class) target, value.toString()); } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterUnitTests.java index 14411655a..71352c8ad 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterUnitTests.java @@ -254,8 +254,8 @@ public class MappingMongoConverterUnitTests { public void considersFieldNameWhenWriting() { Person person = new Person(); - person.firstname ="Oliver"; - + person.firstname = "Oliver"; + DBObject result = new BasicDBObject(); converter.write(person, result); @@ -621,7 +621,7 @@ public class MappingMongoConverterUnitTests { ClassWithMapProperty result = converter.read(ClassWithMapProperty.class, source); Object firstObjectInFoo = ((List) result.mapOfObjects.get("Foo")).get(0); assertThat(firstObjectInFoo, is(instanceOf(Map.class))); - assertThat((String)((Map) firstObjectInFoo).get("Hello"), is(equalTo("World"))); + assertThat((String) ((Map) firstObjectInFoo).get("Hello"), is(equalTo("World"))); } @@ -676,7 +676,7 @@ public class MappingMongoConverterUnitTests { Map map = Collections.singletonMap("Foo", Locale.ENGLISH); CollectionWrapper wrapper = new CollectionWrapper(); - wrapper.listOfMaps = new ArrayList>(); + wrapper.listOfMaps = new ArrayList>(); wrapper.listOfMaps.add(map); DBObject result = new BasicDBObject(); @@ -717,8 +717,8 @@ public class MappingMongoConverterUnitTests { */ @Test public void writesPlainMapOfCollectionsCorrectly() { - - Map> map = Collections.singletonMap("Foo", Arrays.asList(Locale.US)); + + Map> map = Collections.singletonMap("Foo", Arrays.asList(Locale.US)); DBObject result = new BasicDBObject(); converter.write(map, result); @@ -797,7 +797,19 @@ public class MappingMongoConverterUnitTests { } enum SampleEnum { - FIRST, SECOND; + FIRST { + @Override + void method() { + } + }, + SECOND { + @Override + void method() { + + } + }; + + abstract void method(); } class Address { @@ -838,7 +850,7 @@ public class MappingMongoConverterUnitTests { } class ClassWithNestedMaps { - Map>> nestedMaps; + Map>> nestedMaps; } class BirthDateContainer {