From e30eeaae79f27e112b0462c3ed6d565a6597cd5b Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Thu, 12 Nov 2015 11:50:25 +0100 Subject: [PATCH] DATAMONGO-1290 - Convert byte[] parameter in @Query to $binary representation. We now convert non quoted binary parameters to the $binary format. This allows using them along with the @Query annotation. Original pull request: #332. --- .../query/StringBasedMongoQuery.java | 12 ++++++++++ .../query/StringBasedMongoQueryUnitTests.java | 23 +++++++++++++++++++ spring-data-mongodb/template.mf | 1 + 3 files changed, 36 insertions(+) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/StringBasedMongoQuery.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/StringBasedMongoQuery.java index b088d22a1..94b16ce17 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/StringBasedMongoQuery.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/StringBasedMongoQuery.java @@ -21,6 +21,9 @@ import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; +import javax.xml.bind.DatatypeConverter; + +import org.bson.BSON; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.mongodb.core.MongoOperations; @@ -176,6 +179,15 @@ public class StringBasedMongoQuery extends AbstractMongoQuery { return (String) value; } + if (value instanceof byte[]) { + + String base64representation = DatatypeConverter.printBase64Binary((byte[]) value); + if (!binding.isQuoted()) { + return "{ '$binary' : '" + base64representation + "', '$type' : " + BSON.B_GENERAL + "}"; + } + return base64representation; + } + return JSON.serialize(value); } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/StringBasedMongoQueryUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/StringBasedMongoQueryUnitTests.java index b25cabd4b..8e6dcf5f3 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/StringBasedMongoQueryUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/StringBasedMongoQueryUnitTests.java @@ -24,6 +24,9 @@ import java.util.Collections; import java.util.List; import java.util.Map; +import javax.xml.bind.DatatypeConverter; + +import org.bson.BSON; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -289,6 +292,23 @@ public class StringBasedMongoQueryUnitTests { assertThat(query.getQueryObject(), is(new BasicDBObjectBuilder().add("key", "value").get())); } + /** + * @see DATAMONGO-1290 + */ + @Test + public void shouldSupportNonQuotedBinaryDataReplacement() throws Exception { + + byte[] binaryData = "Matthews".getBytes("UTF-8"); + ConvertingParameterAccessor accesor = StubParameterAccessor.getAccessor(converter, binaryData); + StringBasedMongoQuery mongoQuery = createQueryForMethod("findByLastnameAsBinary", byte[].class); + + org.springframework.data.mongodb.core.query.Query query = mongoQuery.createQuery(accesor); + org.springframework.data.mongodb.core.query.Query reference = new BasicQuery("{'lastname' : { '$binary' : '" + + DatatypeConverter.printBase64Binary(binaryData) + "', '$type' : " + BSON.B_GENERAL + "}}"); + + assertThat(query.getQueryObject(), is(reference.getQueryObject())); + } + private StringBasedMongoQuery createQueryForMethod(String name, Class... parameters) throws Exception { Method method = SampleRepository.class.getMethod(name, parameters); @@ -301,6 +321,9 @@ public class StringBasedMongoQueryUnitTests { @Query("{ 'lastname' : ?0 }") Person findByLastname(String lastname); + @Query("{ 'lastname' : ?0 }") + Person findByLastnameAsBinary(byte[] lastname); + @Query("{ 'lastname' : '?0' }") Person findByLastnameQuoted(String lastname); diff --git a/spring-data-mongodb/template.mf b/spring-data-mongodb/template.mf index 67179700b..8b4dcf164 100644 --- a/spring-data-mongodb/template.mf +++ b/spring-data-mongodb/template.mf @@ -16,6 +16,7 @@ Import-Template: javax.tools.*;version="0", javax.net.*;version="0", javax.validation.*;version="${validation:[=.=.=.=,+1.0.0)}";resolution:=optional, + javax.xml.bind.*;version=0, org.aopalliance.*;version="[1.0.0, 2.0.0)";resolution:=optional, org.bson.*;version="0", org.objenesis.*;version="${objenesis:[=.=.=, +1.0.0)}";resolution:=optional,