Skip to content

Commit c62d131

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 7d53f21 commit c62d131

File tree

2 files changed

+26
-8
lines changed

2 files changed

+26
-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
@@ -300,9 +300,7 @@ private Criteria createLikeRegexCriteriaOrThrow(Part part, MongoPersistentProper
300300
criteria = criteria.not();
301301
}
302302

303-
Object next = parameters.next();
304-
305-
return addAppropriateLikeRegexTo(criteria, part, next != null ? next.toString() : "");
303+
return addAppropriateLikeRegexTo(criteria, part, parameters.next());
306304

307305
case NEVER:
308306
// intentional no-op
@@ -330,7 +328,7 @@ private Criteria createContainingCriteria(Part part, MongoPersistentProperty pro
330328
return criteria.in(nextAsArray(parameters));
331329
}
332330

333-
return addAppropriateLikeRegexTo(criteria, part, parameters.next().toString());
331+
return addAppropriateLikeRegexTo(criteria, part, parameters.next());
334332
}
335333

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

346-
return criteria.regex(toLikeRegex(value, part), toRegexOptions(part));
350+
return criteria.regex(toLikeRegex(value.toString(), part), toRegexOptions(part));
347351
}
348352

349353
/**

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

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,9 @@
2929

3030
import org.hamcrest.Matchers;
3131
import org.junit.Before;
32+
import org.junit.Rule;
3233
import org.junit.Test;
34+
import org.junit.rules.ExpectedException;
3335
import org.junit.runner.RunWith;
3436
import org.springframework.beans.factory.annotation.Autowired;
3537
import org.springframework.dao.DuplicateKeyException;
@@ -71,6 +73,8 @@
7173
@RunWith(SpringJUnit4ClassRunner.class)
7274
public abstract class AbstractPersonRepositoryIntegrationTests {
7375

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

7680
@Autowired MongoOperations operations;
@@ -170,6 +174,15 @@ public void findsPersonsByFirstnameLike() throws Exception {
170174
assertThat(result, hasItem(boyd));
171175
}
172176

177+
@Test // DATAMONGO-1608
178+
public void findByFirstnameLikeWithNull() {
179+
180+
expectedException.expect(IllegalArgumentException.class);
181+
expectedException.expectMessage("property 'firstname'");
182+
183+
repository.findByFirstnameLike(null);
184+
}
185+
173186
@Test
174187
public void findsPagedPersons() throws Exception {
175188

@@ -657,9 +670,10 @@ public void executesGeoPageQueryForWithPageRequestForJustOneElementEmptyPage() {
657670
@Test // DATAMONGO-1608
658671
public void findByFirstNameIgnoreCaseWithNull() {
659672

660-
List<Person> result = repository.findByFirstnameIgnoreCase(null);
673+
expectedException.expect(IllegalArgumentException.class);
674+
expectedException.expectMessage("property 'firstname'");
661675

662-
assertThat(result.size(), is(0));
676+
repository.findByFirstnameIgnoreCase(null);
663677
}
664678

665679
@Test // DATAMONGO-770

0 commit comments

Comments
 (0)