From dc31b76bb5d77f5eff31c3f5da5eaaab6e1cf7d5 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Thu, 8 Sep 2016 10:35:27 +0200 Subject: [PATCH 1/2] DATAMONGO-1485 - MongodbSerializer does not take under account registered converters. Prepare issue branch. --- pom.xml | 2 +- spring-data-mongodb-cross-store/pom.xml | 4 ++-- spring-data-mongodb-distribution/pom.xml | 2 +- spring-data-mongodb-log4j/pom.xml | 2 +- spring-data-mongodb/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index dfb64f9ba3..1770649d92 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-mongodb-parent - 1.10.0.BUILD-SNAPSHOT + 1.10.0.DATAMONGO-1485-SNAPSHOT pom Spring Data MongoDB diff --git a/spring-data-mongodb-cross-store/pom.xml b/spring-data-mongodb-cross-store/pom.xml index ae0a5d6c8f..b1d0a45cb2 100644 --- a/spring-data-mongodb-cross-store/pom.xml +++ b/spring-data-mongodb-cross-store/pom.xml @@ -6,7 +6,7 @@ org.springframework.data spring-data-mongodb-parent - 1.10.0.BUILD-SNAPSHOT + 1.10.0.DATAMONGO-1485-SNAPSHOT ../pom.xml @@ -48,7 +48,7 @@ org.springframework.data spring-data-mongodb - 1.10.0.BUILD-SNAPSHOT + 1.10.0.DATAMONGO-1485-SNAPSHOT diff --git a/spring-data-mongodb-distribution/pom.xml b/spring-data-mongodb-distribution/pom.xml index 2d02722262..8ebd15a79d 100644 --- a/spring-data-mongodb-distribution/pom.xml +++ b/spring-data-mongodb-distribution/pom.xml @@ -13,7 +13,7 @@ org.springframework.data spring-data-mongodb-parent - 1.10.0.BUILD-SNAPSHOT + 1.10.0.DATAMONGO-1485-SNAPSHOT ../pom.xml diff --git a/spring-data-mongodb-log4j/pom.xml b/spring-data-mongodb-log4j/pom.xml index ee5e3336db..87307dc813 100644 --- a/spring-data-mongodb-log4j/pom.xml +++ b/spring-data-mongodb-log4j/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-mongodb-parent - 1.10.0.BUILD-SNAPSHOT + 1.10.0.DATAMONGO-1485-SNAPSHOT ../pom.xml diff --git a/spring-data-mongodb/pom.xml b/spring-data-mongodb/pom.xml index 8072d3f665..97821e4f6f 100644 --- a/spring-data-mongodb/pom.xml +++ b/spring-data-mongodb/pom.xml @@ -11,7 +11,7 @@ org.springframework.data spring-data-mongodb-parent - 1.10.0.BUILD-SNAPSHOT + 1.10.0.DATAMONGO-1485-SNAPSHOT ../pom.xml From eca07015d8599a8139377f29d1944c316e4f1c91 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Thu, 8 Sep 2016 12:51:41 +0200 Subject: [PATCH 2/2] DATAMONGO-1485 - Consider potential enum CustomConversion in Querydsl paths. We now take potential registered Converts for enums into account when serializing path expressions via SpringDataMongodbSerializer. --- .../support/SpringDataMongodbSerializer.java | 15 ++++++ .../SpringDataMongodbSerializerUnitTests.java | 50 ++++++++++++++++++- 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbSerializer.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbSerializer.java index 518853060b..d2f0dfef1b 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbSerializer.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbSerializer.java @@ -26,6 +26,7 @@ import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity; import org.springframework.data.mongodb.core.mapping.MongoPersistentProperty; import org.springframework.util.Assert; +import org.springframework.util.ClassUtils; import com.mongodb.DBObject; import com.mongodb.DBRef; @@ -75,6 +76,20 @@ public SpringDataMongodbSerializer(MongoConverter converter) { this.mapper = new QueryMapper(converter); } + /* + * (non-Javadoc) + * @see com.querydsl.mongodb.MongodbSerializer#visit(com.querydsl.core.types.Constant, java.lang.Void) + */ + @Override + public Object visit(Constant expr, Void context) { + + if (!ClassUtils.isAssignable(Enum.class, expr.getType())) { + return super.visit(expr, context); + } + + return converter.convertToMongoType(expr.getConstant()); + } + /* * (non-Javadoc) * @see com.querydsl.mongodb.MongodbSerializer#getKeyForPath(com.querydsl.core.types.Path, com.querydsl.core.types.PathMetadata) diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbSerializerUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbSerializerUnitTests.java index 00fb05b0b7..986a29b4ba 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbSerializerUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbSerializerUnitTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2011-2014 the original author or authors. + * Copyright 2011-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,6 +19,8 @@ import static org.junit.Assert.*; import static org.springframework.data.mongodb.core.DBObjectTestUtils.*; +import java.util.Collections; + import org.bson.types.ObjectId; import org.hamcrest.Matchers; import org.junit.Before; @@ -26,11 +28,15 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; +import org.springframework.core.convert.converter.Converter; +import org.springframework.data.convert.WritingConverter; +import org.springframework.data.mongodb.core.convert.CustomConversions; import org.springframework.data.mongodb.core.convert.DbRefResolver; import org.springframework.data.mongodb.core.convert.MappingMongoConverter; import org.springframework.data.mongodb.core.convert.MongoConverter; import org.springframework.data.mongodb.core.mapping.Field; import org.springframework.data.mongodb.core.mapping.MongoMappingContext; +import org.springframework.data.mongodb.repository.Person.Sex; import org.springframework.data.mongodb.repository.QAddress; import org.springframework.data.mongodb.repository.QPerson; @@ -172,10 +178,52 @@ public void shouldConvertCollectionOfObjectIdEvenWhenNestedInOperatorDbObject() assertThat($in, Matchers. arrayContaining(firstId, secondId)); } + /** + * @see DATAMONGO-1485 + */ + @Test + public void takesCustomConversionForEnumsIntoAccount() { + + MongoMappingContext context = new MongoMappingContext(); + + MappingMongoConverter converter = new MappingMongoConverter(dbFactory, context); + converter.setCustomConversions(new CustomConversions(Collections.singletonList(new SexTypeWriteConverter()))); + converter.afterPropertiesSet(); + + this.converter = converter; + this.serializer = new SpringDataMongodbSerializer(this.converter); + + Object mappedPredicate = this.serializer.handle(QPerson.person.sex.eq(Sex.FEMALE)); + + assertThat(mappedPredicate, is(instanceOf(DBObject.class))); + assertThat(((DBObject) mappedPredicate).get("sex"), is((Object) "f")); + } + class Address { String id; String street; @Field("zip_code") String zipCode; @Field("bar") String[] foo; } + + @WritingConverter + public class SexTypeWriteConverter implements Converter { + + @Override + public String convert(Sex source) { + + if (source == null) { + return null; + } + + switch (source) { + case MALE: + return "m"; + case FEMALE: + return "f"; + default: + throw new IllegalArgumentException("o_O"); + } + } + } }