diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/convert/MappingMongoConverter.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/convert/MappingMongoConverter.java index 9f90186fe..b7f347859 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/convert/MappingMongoConverter.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/convert/MappingMongoConverter.java @@ -397,11 +397,9 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App // Write the properties entity.doWithProperties(new PropertyHandler() { public void doWithPersistentProperty(MongoPersistentProperty prop) { - String name = prop.getName(); - Class type = prop.getType(); Object propertyObj; try { - propertyObj = getProperty(obj, prop, type, useFieldAccessOnly); + propertyObj = getProperty(obj, prop, prop.getType(), useFieldAccessOnly); } catch (IllegalAccessException e) { throw new MappingException(e.getMessage(), e); } catch (InvocationTargetException e) { @@ -411,7 +409,7 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App if (!isSimpleType(propertyObj.getClass())) { writePropertyInternal(prop, propertyObj, dbo); } else { - dbo.put(name, propertyObj); + writeSimpleInternal(prop.getKey(), propertyObj, dbo); } } } @@ -467,7 +465,7 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App org.springframework.data.document.mongodb.mapping.DBRef dbref = prop.getField().getAnnotation( org.springframework.data.document.mongodb.mapping.DBRef.class); - String name = prop.getName(); + String name = prop.getKey(); Class type = prop.getType(); if (prop.isCollection()) { BasicDBList dbList = new BasicDBList(); @@ -552,7 +550,7 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App // being convertable String simpleKey = key.toString(); if (isSimpleType(val.getClass())) { - dbo.put(simpleKey, val); + writeSimpleInternal(simpleKey, val, dbo); } else { DBObject newDbo = new BasicDBObject(); Class componentType = val.getClass(); @@ -571,6 +569,19 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App } } } + + /** + * Writes the given simple value to the given {@link DBObject}. Will store enum names for enum values. + * + * @param key + * @param value + * @param dbObject + */ + private void writeSimpleInternal(String key, Object value, DBObject dbObject) { + + Object valueToSet = value.getClass().isEnum() ? ((Enum) value).name() : value; + dbObject.put(key, valueToSet); + } protected DBRef createDBRef(Object target, org.springframework.data.document.mongodb.mapping.DBRef dbref) { MongoPersistentEntity targetEntity = mappingContext.getPersistentEntity(target.getClass()); diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/mapping/MappingMongoConverterUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/mapping/MappingMongoConverterUnitTests.java index c0a160277..dd2c05ac1 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/mapping/MappingMongoConverterUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/mapping/MappingMongoConverterUnitTests.java @@ -89,7 +89,7 @@ public class MappingMongoConverterUnitTests { DBObject dbObject = new BasicDBObject(); converter.write(person, dbObject); - assertTrue(dbObject.get("birthDate") instanceof Date); + assertThat(dbObject.get("birthDate"), is(Date.class)); Person result = converter.read(Person.class, dbObject); assertThat(result.birthDate, is(notNullValue())); @@ -161,6 +161,43 @@ public class MappingMongoConverterUnitTests { assertThat(result.get(MappingMongoConverter.CUSTOM_TYPE_KEY).toString(), is(Person.class.getName())); } + /** + * @see DATADOC-136 + */ + @Test + public void writesEnumsCorrectly() { + + ClassWithEnumProperty value = new ClassWithEnumProperty(); + value.sampleEnum = SampleEnum.FIRST; + + DBObject result = new BasicDBObject(); + converter.write(value, result); + + assertThat(result.get("sampleEnum"), is(String.class)); + assertThat(result.get("sampleEnum").toString(), is("FIRST")); + } + + /** + * @see DATADOC-136 + */ + @Test + public void readsEnumsCorrectly() { + DBObject dbObject = new BasicDBObject("sampleEnum", "FIRST"); + ClassWithEnumProperty result = converter.read(ClassWithEnumProperty.class, dbObject); + + assertThat(result.sampleEnum, is(SampleEnum.FIRST)); + } + + + class ClassWithEnumProperty { + + SampleEnum sampleEnum; + } + + enum SampleEnum { + FIRST, SECOND; + } + public static class Address { String street; String city; diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java index 3f08bc2b9..a137fa732 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java @@ -16,6 +16,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.document.mongodb.geo.Box; import org.springframework.data.document.mongodb.geo.Circle; import org.springframework.data.document.mongodb.geo.Point; +import org.springframework.data.document.mongodb.repository.Person.Sex; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort.Direction; @@ -31,8 +32,10 @@ public abstract class AbstractPersonRepositoryIntegrationTests { @Autowired protected PersonRepository repository; - Person dave, carter, boyd, stefan, leroi; + Person dave, carter, boyd, stefan, leroi, alicia; QPerson person; + + List all; @Before public void setUp() { @@ -44,10 +47,12 @@ public abstract class AbstractPersonRepositoryIntegrationTests { boyd = new Person("Boyd", "Tinsley", 45); stefan = new Person("Stefan", "Lessard", 34); leroi = new Person("Leroi", "Moore", 41); + + alicia = new Person("Alicia", "Keys", 30, Sex.FEMALE); person = new QPerson("person"); - repository.save(Arrays.asList(dave, carter, boyd, stefan, leroi)); + all = repository.save(Arrays.asList(dave, carter, boyd, stefan, leroi, alicia)); } @Test @@ -59,8 +64,8 @@ public abstract class AbstractPersonRepositoryIntegrationTests { @Test public void findsAllMusicians() throws Exception { List result = repository.findAll(); - assertThat(result, hasItems(dave, carter, boyd, stefan, leroi)); - assertThat(result.size(), is(5)); + assertThat(result.size(), is(all.size())); + assertThat(result.containsAll(all), is(true)); } @Test @@ -70,7 +75,7 @@ public abstract class AbstractPersonRepositoryIntegrationTests { List result = repository.findAll(); - assertThat(result.size(), is(4)); + assertThat(result.size(), is(all.size() - 1)); assertThat(result, not(hasItem(dave))); } @@ -81,7 +86,7 @@ public abstract class AbstractPersonRepositoryIntegrationTests { List result = repository.findAll(); - assertThat(result.size(), is(4)); + assertThat(result.size(), is(all.size() - 1)); assertThat(result, not(hasItem(dave))); } @@ -116,7 +121,8 @@ public abstract class AbstractPersonRepositoryIntegrationTests { Page result = repository.findAll(new PageRequest(1, 2, Direction.ASC, "lastname")); assertThat(result.isFirstPage(), is(false)); assertThat(result.isLastPage(), is(false)); - assertThat(result, hasItems(dave, leroi)); + assertThat(result, hasItems(dave, stefan)); + System.out.println(result); } @Test @@ -237,4 +243,15 @@ public abstract class AbstractPersonRepositoryIntegrationTests { assertThat(page.getNumberOfElements(), is(2)); assertThat(page, hasItems(carter, stefan)); } + + /** + * @see DATADOC-136 + */ + @Test + public void findsPeopleBySexCorrectly() { + + List females = repository.findBySex(Sex.FEMALE); + assertThat(females.size(), is(1)); + assertThat(females.get(0), is(alicia)); + } } \ No newline at end of file diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/Person.java b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/Person.java index c59fa9c0c..e3c117886 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/Person.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/Person.java @@ -29,9 +29,14 @@ import org.springframework.data.document.mongodb.mapping.Document; @Document public class Person extends Contact { + public enum Sex { + MALE, FEMALE; + } + private String firstname; private String lastname; private Integer age; + private Sex sex; @GeoSpatialIndexed private Point location; @@ -51,10 +56,16 @@ public class Person extends Contact { public Person(String firstname, String lastname, Integer age) { + this(firstname, lastname, age, Sex.MALE); + } + + public Person(String firstname, String lastname, Integer age, Sex sex) { + super(); this.firstname = firstname; this.lastname = lastname; this.age = age; + this.sex = sex; } /** diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/PersonRepository.java b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/PersonRepository.java index 3946564be..29b64d266 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/PersonRepository.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/PersonRepository.java @@ -21,6 +21,7 @@ import java.util.List; import org.springframework.data.document.mongodb.geo.Box; import org.springframework.data.document.mongodb.geo.Circle; import org.springframework.data.document.mongodb.geo.Point; +import org.springframework.data.document.mongodb.repository.Person.Sex; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -118,4 +119,6 @@ public interface PersonRepository extends MongoRepository, Query List findByLocationWithin(Circle circle); List findByLocationWithin(Box box); + + List findBySex(Sex sex); }