From cbfc46270e3cb3e99a94c15cfaa30dae651dc2e0 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 f0391683f..a3c976be2 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; @@ -224,6 +227,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 e22e5f8f9..c7f018c49 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; @@ -343,6 +346,23 @@ public class StringBasedMongoQueryUnitTests { assertThat(query.getQueryObject(), is(reference.getQueryObject())); } + /** + * @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); @@ -355,6 +375,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 1966fc8db..570624241 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,