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:
@@ -28,6 +28,7 @@ import com.mongodb.DBObject;
|
|||||||
import com.mysema.query.mongodb.MongodbSerializer;
|
import com.mysema.query.mongodb.MongodbSerializer;
|
||||||
import com.mysema.query.types.Path;
|
import com.mysema.query.types.Path;
|
||||||
import com.mysema.query.types.PathMetadata;
|
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.
|
* Custom {@link MongodbSerializer} to take mapping information into account when building keys for constraints.
|
||||||
@@ -61,6 +62,10 @@ class SpringDataMongodbSerializer extends MongodbSerializer {
|
|||||||
@Override
|
@Override
|
||||||
protected String getKeyForPath(Path<?> expr, PathMetadata<?> metadata) {
|
protected String getKeyForPath(Path<?> expr, PathMetadata<?> metadata) {
|
||||||
|
|
||||||
|
if (!metadata.getPathType().equals(PathType.PROPERTY)) {
|
||||||
|
return super.getKeyForPath(expr, metadata);
|
||||||
|
}
|
||||||
|
|
||||||
Path<?> parent = metadata.getParent();
|
Path<?> parent = metadata.getParent();
|
||||||
MongoPersistentEntity<?> entity = mappingContext.getPersistentEntity(parent.getType());
|
MongoPersistentEntity<?> entity = mappingContext.getPersistentEntity(parent.getType());
|
||||||
MongoPersistentProperty property = entity.getPersistentProperty(metadata.getName());
|
MongoPersistentProperty property = entity.getPersistentProperty(metadata.getName());
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ import com.mongodb.BasicDBObject;
|
|||||||
import com.mongodb.DBObject;
|
import com.mongodb.DBObject;
|
||||||
import com.mysema.query.types.expr.BooleanOperation;
|
import com.mysema.query.types.expr.BooleanOperation;
|
||||||
import com.mysema.query.types.path.PathBuilder;
|
import com.mysema.query.types.path.PathBuilder;
|
||||||
|
import com.mysema.query.types.path.SimplePath;
|
||||||
import com.mysema.query.types.path.StringPath;
|
import com.mysema.query.types.path.StringPath;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -46,8 +47,7 @@ import com.mysema.query.types.path.StringPath;
|
|||||||
@RunWith(MockitoJUnitRunner.class)
|
@RunWith(MockitoJUnitRunner.class)
|
||||||
public class SpringDataMongodbSerializerUnitTests {
|
public class SpringDataMongodbSerializerUnitTests {
|
||||||
|
|
||||||
@Mock
|
@Mock MongoDbFactory dbFactory;
|
||||||
MongoDbFactory dbFactory;
|
|
||||||
MongoConverter converter;
|
MongoConverter converter;
|
||||||
SpringDataMongodbSerializer serializer;
|
SpringDataMongodbSerializer serializer;
|
||||||
|
|
||||||
@@ -117,10 +117,23 @@ public class SpringDataMongodbSerializerUnitTests {
|
|||||||
assertThat(result.get("_id"), is((Object) id));
|
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 {
|
class Address {
|
||||||
String id;
|
String id;
|
||||||
String street;
|
String street;
|
||||||
@Field("zip_code")
|
@Field("zip_code") String zipCode;
|
||||||
String zipCode;
|
@Field("bar") String[] foo;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user