Skip to content

Commit c0781ef

Browse files
committed
Fix NPE on IndexQuery with source and version.
Original Pull Request #1894 Closes #1893 (cherry picked from commit 36b449c)
1 parent d371404 commit c0781ef

File tree

2 files changed

+37
-13
lines changed

2 files changed

+37
-13
lines changed

Diff for: src/main/java/org/springframework/data/elasticsearch/core/RequestFactory.java

+16-10
Original file line numberDiff line numberDiff line change
@@ -760,15 +760,17 @@ public IndexRequest indexRequest(IndexQuery query, IndexCoordinates index) {
760760
String indexName = index.getIndexName();
761761
IndexRequest indexRequest;
762762

763-
if (query.getObject() != null) {
764-
String id = StringUtils.isEmpty(query.getId()) ? getPersistentEntityId(query.getObject()) : query.getId();
763+
Object queryObject = query.getObject();
764+
765+
if (queryObject != null) {
766+
String id = StringUtils.isEmpty(query.getId()) ? getPersistentEntityId(queryObject) : query.getId();
765767
// If we have a query id and a document id, do not ask ES to generate one.
766768
if (id != null) {
767769
indexRequest = new IndexRequest(indexName).id(id);
768770
} else {
769771
indexRequest = new IndexRequest(indexName);
770772
}
771-
indexRequest.source(elasticsearchConverter.mapObject(query.getObject()).toJson(), Requests.INDEX_CONTENT_TYPE);
773+
indexRequest.source(elasticsearchConverter.mapObject(queryObject).toJson(), Requests.INDEX_CONTENT_TYPE);
772774
} else if (query.getSource() != null) {
773775
indexRequest = new IndexRequest(indexName).id(query.getId()).source(query.getSource(),
774776
Requests.INDEX_CONTENT_TYPE);
@@ -779,7 +781,8 @@ public IndexRequest indexRequest(IndexQuery query, IndexCoordinates index) {
779781

780782
if (query.getVersion() != null) {
781783
indexRequest.version(query.getVersion());
782-
VersionType versionType = retrieveVersionTypeFromPersistentEntity(query.getObject().getClass());
784+
VersionType versionType = retrieveVersionTypeFromPersistentEntity(
785+
queryObject != null ? queryObject.getClass() : null);
783786
indexRequest.versionType(versionType);
784787
}
785788

@@ -814,15 +817,16 @@ public IndexRequestBuilder indexRequestBuilder(Client client, IndexQuery query,
814817

815818
IndexRequestBuilder indexRequestBuilder;
816819

817-
if (query.getObject() != null) {
818-
String id = StringUtils.isEmpty(query.getId()) ? getPersistentEntityId(query.getObject()) : query.getId();
820+
Object queryObject = query.getObject();
821+
if (queryObject != null) {
822+
String id = StringUtils.isEmpty(query.getId()) ? getPersistentEntityId(queryObject) : query.getId();
819823
// If we have a query id and a document id, do not ask ES to generate one.
820824
if (id != null) {
821825
indexRequestBuilder = client.prepareIndex(indexName, type, id);
822826
} else {
823827
indexRequestBuilder = client.prepareIndex(indexName, type);
824828
}
825-
indexRequestBuilder.setSource(elasticsearchConverter.mapObject(query.getObject()).toJson(),
829+
indexRequestBuilder.setSource(elasticsearchConverter.mapObject(queryObject).toJson(),
826830
Requests.INDEX_CONTENT_TYPE);
827831
} else if (query.getSource() != null) {
828832
indexRequestBuilder = client.prepareIndex(indexName, type, query.getId()).setSource(query.getSource(),
@@ -834,7 +838,8 @@ public IndexRequestBuilder indexRequestBuilder(Client client, IndexQuery query,
834838

835839
if (query.getVersion() != null) {
836840
indexRequestBuilder.setVersion(query.getVersion());
837-
VersionType versionType = retrieveVersionTypeFromPersistentEntity(query.getObject().getClass());
841+
VersionType versionType = retrieveVersionTypeFromPersistentEntity(
842+
queryObject != null ? queryObject.getClass() : null);
838843
indexRequestBuilder.setVersionType(versionType);
839844
}
840845

@@ -1695,12 +1700,13 @@ private String getPersistentEntityId(Object entity) {
16951700
return null;
16961701
}
16971702

1698-
private VersionType retrieveVersionTypeFromPersistentEntity(Class<?> clazz) {
1703+
private VersionType retrieveVersionTypeFromPersistentEntity(@Nullable Class<?> clazz) {
16991704

17001705
MappingContext<? extends ElasticsearchPersistentEntity<?>, ElasticsearchPersistentProperty> mappingContext = elasticsearchConverter
17011706
.getMappingContext();
17021707

1703-
ElasticsearchPersistentEntity<?> persistentEntity = mappingContext.getPersistentEntity(clazz);
1708+
ElasticsearchPersistentEntity<?> persistentEntity = clazz != null ? mappingContext.getPersistentEntity(clazz)
1709+
: null;
17041710

17051711
VersionType versionType = null;
17061712

Diff for: src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java

+21-3
Original file line numberDiff line numberDiff line change
@@ -1129,7 +1129,8 @@ void shouldUsePageableOnMoreLikeThisQueries() {
11291129
Collection<String> ids = IntStream.rangeClosed(1, 10).mapToObj(i -> nextIdAsString()).collect(Collectors.toList());
11301130
ids.add(referenceId);
11311131
ids.stream()
1132-
.map(id -> getIndexQuery(SampleEntity.builder().id(id).message(sampleMessage).version(System.currentTimeMillis()).build()))
1132+
.map(id -> getIndexQuery(
1133+
SampleEntity.builder().id(id).message(sampleMessage).version(System.currentTimeMillis()).build()))
11331134
.forEach(indexQuery -> operations.index(indexQuery, index));
11341135
indexOperations.refresh();
11351136

@@ -1144,7 +1145,8 @@ void shouldUsePageableOnMoreLikeThisQueries() {
11441145
assertThat(searchHits.getTotalHits()).isEqualTo(10);
11451146
assertThat(searchHits.getSearchHits()).hasSize(5);
11461147

1147-
Collection<String> returnedIds = searchHits.getSearchHits().stream().map(SearchHit::getId).collect(Collectors.toList());
1148+
Collection<String> returnedIds = searchHits.getSearchHits().stream().map(SearchHit::getId)
1149+
.collect(Collectors.toList());
11481150

11491151
moreLikeThisQuery.setPageable(PageRequest.of(1, 5));
11501152

@@ -3794,6 +3796,22 @@ void shouldReturnExplanationWhenRequested() {
37943796
assertThat(explanation).isNotNull();
37953797
}
37963798

3799+
@Test // #1893
3800+
@DisplayName("should index document from source with version")
3801+
void shouldIndexDocumentFromSourceWithVersion() {
3802+
3803+
String source = "{\n" + //
3804+
" \"answer\": 42\n" + //
3805+
"}";
3806+
IndexQuery query = new IndexQueryBuilder() //
3807+
.withId("42") //
3808+
.withSource(source) //
3809+
.withVersion(42L) //
3810+
.build();
3811+
3812+
operations.index(query, IndexCoordinates.of(INDEX_NAME_SAMPLE_ENTITY));
3813+
}
3814+
37973815
// region entities
37983816
@Document(indexName = INDEX_NAME_SAMPLE_ENTITY)
37993817
@Setting(shards = 1, replicas = 0, refreshInterval = "-1")
@@ -4572,5 +4590,5 @@ public void setText(@Nullable String text) {
45724590
this.text = text;
45734591
}
45744592
}
4575-
//endregion
4593+
// endregion
45764594
}

0 commit comments

Comments
 (0)