DATAMONGO-761 - Fix path key lookup for non-properties in SpringDataMongoDBSerializer.

In our Querydsl MongodbSerializer implementation we now only inspect the MongoPersistentProperty for a field name if the given path is really a property path. Previously we tried to always resolve a persistent property even if the given path was an array index path, a map key or the like.
This commit is contained in:
Oliver Gierke
2013-10-08 12:37:18 +02:00
parent 6abdb0aa46
commit e643d39fa6
2 changed files with 22 additions and 4 deletions

View File

@@ -28,6 +28,7 @@ import com.mongodb.DBObject;
import com.mysema.query.mongodb.MongodbSerializer;
import com.mysema.query.types.Path;
import com.mysema.query.types.PathMetadata;
import com.mysema.query.types.PathType;
/**
* Custom {@link MongodbSerializer} to take mapping information into account when building keys for constraints.
@@ -61,6 +62,10 @@ class SpringDataMongodbSerializer extends MongodbSerializer {
@Override
protected String getKeyForPath(Path<?> expr, PathMetadata<?> metadata) {
if (!metadata.getPathType().equals(PathType.PROPERTY)) {
return super.getKeyForPath(expr, metadata);
}
Path<?> parent = metadata.getParent();
MongoPersistentEntity<?> entity = mappingContext.getPersistentEntity(parent.getType());
MongoPersistentProperty property = entity.getPersistentProperty(metadata.getName());

View File

@@ -36,6 +36,7 @@ import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
import com.mysema.query.types.expr.BooleanOperation;
import com.mysema.query.types.path.PathBuilder;
import com.mysema.query.types.path.SimplePath;
import com.mysema.query.types.path.StringPath;
/**
@@ -46,8 +47,7 @@ import com.mysema.query.types.path.StringPath;
@RunWith(MockitoJUnitRunner.class)
public class SpringDataMongodbSerializerUnitTests {
@Mock
MongoDbFactory dbFactory;
@Mock MongoDbFactory dbFactory;
MongoConverter converter;
SpringDataMongodbSerializer serializer;
@@ -117,10 +117,23 @@ public class SpringDataMongodbSerializerUnitTests {
assertThat(result.get("_id"), is((Object) id));
}
/**
* @see DATAMONGO-761
*/
@Test
public void looksUpKeyForNonPropertyPath() {
PathBuilder<Address> builder = new PathBuilder<Address>(Address.class, "address");
SimplePath<Object> firstElementPath = builder.getArray("foo", String[].class).get(0);
String path = serializer.getKeyForPath(firstElementPath, firstElementPath.getMetadata());
assertThat(path, is("0"));
}
class Address {
String id;
String street;
@Field("zip_code")
String zipCode;
@Field("zip_code") String zipCode;
@Field("bar") String[] foo;
}
}