Skip to content

Commit cd42b19

Browse files
DATAMONGO-1608 - Polishing.
Throw an IllegalArgumentException when trying to create a query using 'null' as an argument for queries resulting in a $regex query operator. Original Pull Request: #439
1 parent eacfd2c commit cd42b19

File tree

2 files changed

+29
-8
lines changed

2 files changed

+29
-8
lines changed

spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryCreator.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -298,9 +298,7 @@ private Criteria createLikeRegexCriteriaOrThrow(Part part, MongoPersistentProper
298298
criteria = criteria.not();
299299
}
300300

301-
Object next = parameters.next();
302-
303-
return addAppropriateLikeRegexTo(criteria, part, next != null ? next.toString() : "");
301+
return addAppropriateLikeRegexTo(criteria, part, parameters.next());
304302

305303
case NEVER:
306304
// intentional no-op
@@ -328,7 +326,7 @@ private Criteria createContainingCriteria(Part part, MongoPersistentProperty pro
328326
return criteria.in(nextAsArray(parameters));
329327
}
330328

331-
return addAppropriateLikeRegexTo(criteria, part, parameters.next().toString());
329+
return addAppropriateLikeRegexTo(criteria, part, parameters.next());
332330
}
333331

334332
/**
@@ -339,9 +337,15 @@ private Criteria createContainingCriteria(Part part, MongoPersistentProperty pro
339337
* @param value
340338
* @return the criteria extended with the regex.
341339
*/
342-
private Criteria addAppropriateLikeRegexTo(Criteria criteria, Part part, String value) {
340+
private Criteria addAppropriateLikeRegexTo(Criteria criteria, Part part, Object value) {
341+
342+
if (value == null) {
343+
344+
throw new IllegalArgumentException(String.format(
345+
"Argument for creating $regex pattern for property '%s' must not be null!", part.getProperty().getSegment()));
346+
}
343347

344-
return criteria.regex(toLikeRegex(value, part), toRegexOptions(part));
348+
return criteria.regex(toLikeRegex(value.toString(), part), toRegexOptions(part));
345349
}
346350

347351
/**

spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@
3030
import org.hamcrest.Matchers;
3131
import org.junit.Before;
3232
import org.junit.Ignore;
33+
import org.junit.Rule;
3334
import org.junit.Test;
35+
import org.junit.rules.ExpectedException;
3436
import org.junit.runner.RunWith;
3537
import org.springframework.beans.factory.annotation.Autowired;
3638
import org.springframework.dao.DuplicateKeyException;
@@ -72,6 +74,8 @@
7274
@RunWith(SpringJUnit4ClassRunner.class)
7375
public abstract class AbstractPersonRepositoryIntegrationTests {
7476

77+
public @Rule ExpectedException expectedException = ExpectedException.none();
78+
7579
@Autowired protected PersonRepository repository;
7680

7781
@Autowired MongoOperations operations;
@@ -171,6 +175,18 @@ public void findsPersonsByFirstnameLike() throws Exception {
171175
assertThat(result, hasItem(boyd));
172176
}
173177

178+
/**
179+
* @see DATAMONGO-1608
180+
*/
181+
@Test
182+
public void findByFirstnameLikeWithNull() {
183+
184+
expectedException.expect(IllegalArgumentException.class);
185+
expectedException.expectMessage("property 'firstname'");
186+
187+
repository.findByFirstnameLike(null);
188+
}
189+
174190
@Test
175191
public void findsPagedPersons() throws Exception {
176192

@@ -720,9 +736,10 @@ public void executesGeoPageQueryForWithPageRequestForJustOneElementEmptyPage() {
720736
@Test
721737
public void findByFirstNameIgnoreCaseWithNull() {
722738

723-
List<Person> result = repository.findByFirstnameIgnoreCase(null);
739+
expectedException.expect(IllegalArgumentException.class);
740+
expectedException.expectMessage("property 'firstname'");
724741

725-
assertThat(result.size(), is(0));
742+
repository.findByFirstnameIgnoreCase(null);
726743
}
727744

728745
/**

0 commit comments

Comments
 (0)