Skip to content

Commit 60d8d35

Browse files
GH-2301 - Assert not null on domain class and ensure a type could be determined.
Fixes #2301.
1 parent 668eb36 commit 60d8d35

File tree

6 files changed

+44
-14
lines changed

6 files changed

+44
-14
lines changed

src/main/java/org/springframework/data/neo4j/core/Neo4jTemplate.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -431,7 +431,8 @@ private <T> List<T> saveAllImpl(Iterable<T> instances, @Nullable List<PropertyDe
431431
}
432432

433433
Class<T> domainClass = (Class<T>) TemplateSupport.findCommonElementType(entities);
434-
Neo4jPersistentEntity entityMetaData = neo4jMappingContext.getPersistentEntity(domainClass);
434+
Assert.notNull(domainClass, "Could not determine common domain class to save.");
435+
Neo4jPersistentEntity<?> entityMetaData = neo4jMappingContext.getPersistentEntity(domainClass);
435436
if (entityMetaData.isUsingInternalIds() || entityMetaData.hasVersionProperty()
436437
|| entityMetaData.getDynamicLabelsProperty().isPresent()) {
437438
log.debug("Saving entities using single statements.");

src/main/java/org/springframework/data/neo4j/core/ReactiveNeo4jTemplate.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -448,7 +448,8 @@ private <T> Flux<T> saveAllImpl(Iterable<T> instances, @Nullable List<PropertyDe
448448
}
449449

450450
Class<T> domainClass = (Class<T>) TemplateSupport.findCommonElementType(entities);
451-
Neo4jPersistentEntity entityMetaData = neo4jMappingContext.getPersistentEntity(domainClass);
451+
Assert.notNull(domainClass, "Could not determine common domain class to save.");
452+
Neo4jPersistentEntity<?> entityMetaData = neo4jMappingContext.getPersistentEntity(domainClass);
452453

453454
if (entityMetaData.isUsingInternalIds() || entityMetaData.hasVersionProperty()
454455
|| entityMetaData.getDynamicLabelsProperty().isPresent()) {

src/main/java/org/springframework/data/neo4j/core/TemplateSupport.java

+4
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,10 @@ enum FetchType {
6666
@Nullable
6767
public static Class<?> findCommonElementType(Iterable<?> collection) {
6868

69+
if (collection == null) {
70+
return null;
71+
}
72+
6973
Collection<Class<?>> allClasses = StreamSupport.stream(collection.spliterator(), true)
7074
.filter(o -> o != null)
7175
.map(Object::getClass).collect(Collectors.toSet());

src/main/java/org/springframework/data/neo4j/repository/query/Neo4jQuerySupport.java

+13-12
Original file line numberDiff line numberDiff line change
@@ -185,18 +185,19 @@ final Object convertParameter(Object parameter, @Nullable Function<Object, Value
185185
return convertBoundingBox((BoundingBox) parameter);
186186
}
187187

188-
Class<?> type;
189-
if (parameter instanceof Collection && mappingContext
190-
.hasPersistentEntityFor(TemplateSupport.findCommonElementType((Collection) parameter))) {
191-
192-
EntityWriter<Object, Map<String, Object>> objectMapEntityWriter = Neo4jNestedMapEntityWriter
193-
.forContext(mappingContext);
194-
195-
return ((Collection<?>) parameter).stream().map(v -> {
196-
Map<String, Object> result = new HashMap<>();
197-
objectMapEntityWriter.write(v, result);
198-
return result;
199-
}).collect(Collectors.toList());
188+
if (parameter instanceof Collection) {
189+
Class<?> type = TemplateSupport.findCommonElementType((Collection) parameter);
190+
if (type != null && mappingContext.hasPersistentEntityFor(type)) {
191+
192+
EntityWriter<Object, Map<String, Object>> objectMapEntityWriter = Neo4jNestedMapEntityWriter
193+
.forContext(mappingContext);
194+
195+
return ((Collection<?>) parameter).stream().map(v -> {
196+
Map<String, Object> result = new HashMap<>();
197+
objectMapEntityWriter.write(v, result);
198+
return result;
199+
}).collect(Collectors.toList());
200+
}
200201
}
201202

202203
if (mappingContext.hasPersistentEntityFor(parameter.getClass())) {

src/test/java/org/springframework/data/neo4j/core/TemplateSupportTest.java

+15
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import static org.assertj.core.api.Assertions.assertThat;
1919

2020
import java.util.Arrays;
21+
import java.util.Collections;
2122

2223
import org.junit.jupiter.api.Test;
2324

@@ -76,6 +77,20 @@ void shouldNotFailWithNull() {
7677
assertThat(type).isNotNull().isEqualTo(A.class);
7778
}
7879

80+
@Test
81+
void shouldNotFailWithNullInput() {
82+
83+
Class<?> type = TemplateSupport.findCommonElementType(null);
84+
assertThat(type).isNull();
85+
}
86+
87+
@Test
88+
void shouldNotFailWithEmptyInput() {
89+
90+
Class<?> type = TemplateSupport.findCommonElementType(Collections.emptyList());
91+
assertThat(type).isNull();
92+
}
93+
7994
@Test
8095
void shouldFindCommonElementTypeOfHumongousCollection() {
8196

src/test/java/org/springframework/data/neo4j/integration/imperative/RepositoryIT.java

+8
Original file line numberDiff line numberDiff line change
@@ -3101,6 +3101,14 @@ void findByIn(@Autowired PersonRepository repository) {
31013101
assertThat(persons).hasSize(1).contains(person2);
31023102
}
31033103

3104+
@Test // GH-2301
3105+
void findByEmptyIn(@Autowired PersonRepository repository) {
3106+
3107+
List<PersonWithAllConstructor> persons = repository
3108+
.findAllByFirstNameIn(Collections.emptyList());
3109+
assertThat(persons).isEmpty();
3110+
}
3111+
31043112
@Test
31053113
void findByNotIn(@Autowired PersonRepository repository) {
31063114

0 commit comments

Comments
 (0)