From 1a1cd9ef14d2640187d4d68b105bcc5421081bc9 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Thu, 8 Sep 2016 12:51:41 +0200 Subject: [PATCH] DATAMONGO-1485 - Consider potential custom conversion for enums in Querydsl paths. We now take potential registered converters for enums into account when serializing path expressions via SpringDataMongodbSerializer. Original pull request: #388. --- .../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 518853060..d2f0dfef1 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.convert.QueryMapper; 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 @@ class SpringDataMongodbSerializer extends MongodbSerializer { 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 00fb05b0b..986a29b4b 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.hamcrest.Matchers.*; 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.Test; 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 class SpringDataMongodbSerializerUnitTests { 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"); + } + } + } }