Skip to content

Commit 62dd7d0

Browse files
christophstroblodrotbohm
authored andcommitted
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.
1 parent 5df92a8 commit 62dd7d0

File tree

2 files changed

+65
-1
lines changed

2 files changed

+65
-1
lines changed

spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbSerializer.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,11 @@
2626
import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity;
2727
import org.springframework.data.mongodb.core.mapping.MongoPersistentProperty;
2828
import org.springframework.util.Assert;
29+
import org.springframework.util.ClassUtils;
2930

3031
import com.mongodb.DBObject;
3132
import com.mongodb.DBRef;
33+
import com.querydsl.core.types.Constant;
3234
import com.querydsl.core.types.Path;
3335
import com.querydsl.core.types.PathMetadata;
3436
import com.querydsl.core.types.PathType;
@@ -72,6 +74,20 @@ public SpringDataMongodbSerializer(MongoConverter converter) {
7274
this.mapper = new QueryMapper(converter);
7375
}
7476

77+
/*
78+
* (non-Javadoc)
79+
* @see com.querydsl.mongodb.MongodbSerializer#visit(com.querydsl.core.types.Constant, java.lang.Void)
80+
*/
81+
@Override
82+
public Object visit(Constant<?> expr, Void context) {
83+
84+
if (!ClassUtils.isAssignable(Enum.class, expr.getType())) {
85+
return super.visit(expr, context);
86+
}
87+
88+
return converter.convertToMongoType(expr.getConstant());
89+
}
90+
7591
/*
7692
* (non-Javadoc)
7793
* @see com.querydsl.mongodb.MongodbSerializer#getKeyForPath(com.querydsl.core.types.Path, com.querydsl.core.types.PathMetadata)

spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbSerializerUnitTests.java

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2011-2014 the original author or authors.
2+
* Copyright 2011-2016 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -19,18 +19,24 @@
1919
import static org.junit.Assert.*;
2020
import static org.springframework.data.mongodb.core.DBObjectTestUtils.*;
2121

22+
import java.util.Collections;
23+
2224
import org.bson.types.ObjectId;
2325
import org.hamcrest.Matchers;
2426
import org.junit.Before;
2527
import org.junit.Test;
2628
import org.junit.runner.RunWith;
2729
import org.mockito.Mock;
2830
import org.mockito.runners.MockitoJUnitRunner;
31+
import org.springframework.core.convert.converter.Converter;
32+
import org.springframework.data.convert.WritingConverter;
33+
import org.springframework.data.mongodb.core.convert.CustomConversions;
2934
import org.springframework.data.mongodb.core.convert.DbRefResolver;
3035
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
3136
import org.springframework.data.mongodb.core.convert.MongoConverter;
3237
import org.springframework.data.mongodb.core.mapping.Field;
3338
import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
39+
import org.springframework.data.mongodb.repository.Person.Sex;
3440
import org.springframework.data.mongodb.repository.QAddress;
3541
import org.springframework.data.mongodb.repository.QPerson;
3642

@@ -172,10 +178,52 @@ public void shouldConvertCollectionOfObjectIdEvenWhenNestedInOperatorDbObject()
172178
assertThat($in, Matchers.<Object> arrayContaining(firstId, secondId));
173179
}
174180

181+
/**
182+
* @see DATAMONGO-1485
183+
*/
184+
@Test
185+
public void takesCustomConversionForEnumsIntoAccount() {
186+
187+
MongoMappingContext context = new MongoMappingContext();
188+
189+
MappingMongoConverter converter = new MappingMongoConverter(dbFactory, context);
190+
converter.setCustomConversions(new CustomConversions(Collections.singletonList(new SexTypeWriteConverter())));
191+
converter.afterPropertiesSet();
192+
193+
this.converter = converter;
194+
this.serializer = new SpringDataMongodbSerializer(this.converter);
195+
196+
Object mappedPredicate = this.serializer.handle(QPerson.person.sex.eq(Sex.FEMALE));
197+
198+
assertThat(mappedPredicate, is(instanceOf(DBObject.class)));
199+
assertThat(((DBObject) mappedPredicate).get("sex"), is((Object) "f"));
200+
}
201+
175202
class Address {
176203
String id;
177204
String street;
178205
@Field("zip_code") String zipCode;
179206
@Field("bar") String[] foo;
180207
}
208+
209+
@WritingConverter
210+
public class SexTypeWriteConverter implements Converter<Sex, String> {
211+
212+
@Override
213+
public String convert(Sex source) {
214+
215+
if (source == null) {
216+
return null;
217+
}
218+
219+
switch (source) {
220+
case MALE:
221+
return "m";
222+
case FEMALE:
223+
return "f";
224+
default:
225+
throw new IllegalArgumentException("o_O");
226+
}
227+
}
228+
}
181229
}

0 commit comments

Comments
 (0)