Polishing.
Support DBObject and Map that as source for entity materialization and map conversion. See #3702 Original pull request: #3704.
This commit is contained in:
@@ -2042,14 +2042,11 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App
|
||||
if (typeHint.isMap()) {
|
||||
|
||||
if(ClassUtils.isAssignable(Document.class, typeHint.getType())) {
|
||||
return (S) documentConverter.convert(this, (Bson) source, typeHint);
|
||||
return (S) documentConverter.convert(this, BsonUtils.asBson(source), typeHint);
|
||||
}
|
||||
|
||||
if(source instanceof Bson) {
|
||||
return (S) mapConverter.convert(this, (Bson) source, typeHint);
|
||||
}
|
||||
if(source instanceof Map) {
|
||||
return (S) mapConverter.convert(this, new Document((Map<String,Object>) source), typeHint);
|
||||
if (BsonUtils.supportsBson(source)) {
|
||||
return (S) mapConverter.convert(this, BsonUtils.asBson(source), typeHint);
|
||||
}
|
||||
|
||||
throw new IllegalArgumentException(String.format("Expected map like structure but found %s", source.getClass()));
|
||||
@@ -2064,8 +2061,8 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App
|
||||
String.format(INCOMPATIBLE_TYPES, source, BasicDBList.class, typeHint.getType(), getPath()));
|
||||
}
|
||||
|
||||
if (source instanceof Bson) {
|
||||
return (S) documentConverter.convert(this, (Bson) source, typeHint);
|
||||
if (BsonUtils.supportsBson(source)) {
|
||||
return (S) documentConverter.convert(this, BsonUtils.asBson(source), typeHint);
|
||||
}
|
||||
|
||||
return (S) elementConverter.convert(source, typeHint);
|
||||
|
||||
@@ -494,6 +494,49 @@ public class BsonUtils {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the given source object as {@link Bson}, i.e. {@link Document}s and maps as is or throw
|
||||
* {@link IllegalArgumentException}.
|
||||
*
|
||||
* @param source
|
||||
* @return the converted/casted source object.
|
||||
* @throws IllegalArgumentException if {@code source} cannot be converted/cast to {@link Bson}.
|
||||
* @since 3.2.3
|
||||
* @see #supportsBson(Object)
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public static Bson asBson(Object source) {
|
||||
|
||||
if (source instanceof Document) {
|
||||
return (Document) source;
|
||||
}
|
||||
|
||||
if (source instanceof BasicDBObject) {
|
||||
return (BasicDBObject) source;
|
||||
}
|
||||
|
||||
if (source instanceof DBObject) {
|
||||
return new Document(((DBObject) source).toMap());
|
||||
}
|
||||
|
||||
if (source instanceof Map) {
|
||||
return new Document((Map<String, Object>) source);
|
||||
}
|
||||
|
||||
throw new IllegalArgumentException(String.format("Cannot convert %s to Bson", source));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the given source can be used/converted as {@link Bson}.
|
||||
*
|
||||
* @param source
|
||||
* @return {@literal true} if the given source can be converted to {@link Bson}.
|
||||
* @since 3.2.3
|
||||
*/
|
||||
public static boolean supportsBson(Object source) {
|
||||
return source instanceof DBObject || source instanceof Map;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns given object as {@link Collection}. Will return the {@link Collection} as is if the source is a
|
||||
* {@link Collection} already, will convert an array into a {@link Collection} or simply create a single element
|
||||
|
||||
@@ -934,10 +934,11 @@ class MappingMongoConverterUnitTests {
|
||||
assertThat(readResult.iterator().next()).isInstanceOf(Address.class);
|
||||
}
|
||||
|
||||
@Test // DATAMONGO-402
|
||||
@Test // DATAMONGO-402, GH-3702
|
||||
void readsMemberClassCorrectly() {
|
||||
|
||||
org.bson.Document document = new org.bson.Document("inner", new org.bson.Document("value", "FOO!"));
|
||||
org.bson.Document document = new org.bson.Document("inner",
|
||||
new LinkedHashMap<>(new org.bson.Document("value", "FOO!")));
|
||||
|
||||
Outer outer = converter.read(Outer.class, document);
|
||||
assertThat(outer.inner).isNotNull();
|
||||
|
||||
@@ -19,7 +19,7 @@ import static org.assertj.core.api.Assertions.*;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Collections;
|
||||
|
||||
import org.bson.BsonDouble;
|
||||
import org.bson.BsonInt32;
|
||||
@@ -29,10 +29,16 @@ import org.bson.BsonString;
|
||||
import org.bson.Document;
|
||||
import org.bson.types.ObjectId;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.data.mongodb.util.BsonUtils;
|
||||
|
||||
import com.mongodb.BasicDBList;
|
||||
|
||||
/**
|
||||
* Unit tests for {@link BsonUtils}.
|
||||
*
|
||||
* @author Christoph Strobl
|
||||
* @author Mark Paluch
|
||||
*/
|
||||
class BsonUtilsTest {
|
||||
|
||||
@@ -111,4 +117,13 @@ class BsonUtilsTest {
|
||||
|
||||
assertThat((Collection)BsonUtils.asCollection(source)).containsExactly(source);
|
||||
}
|
||||
|
||||
@Test // GH-3702
|
||||
void supportsBsonShouldReportIfConversionSupported() {
|
||||
|
||||
assertThat(BsonUtils.supportsBson("foo")).isFalse();
|
||||
assertThat(BsonUtils.supportsBson(new Document())).isTrue();
|
||||
assertThat(BsonUtils.supportsBson(new BasicDBList())).isTrue();
|
||||
assertThat(BsonUtils.supportsBson(Collections.emptyMap())).isTrue();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user