From c0781efbaad16bb4d9a943f9692bf6b356609bda Mon Sep 17 00:00:00 2001 From: Peter-Josef Meisch Date: Fri, 6 Aug 2021 20:01:02 +0200 Subject: [PATCH] Fix NPE on IndexQuery with source and version. Original Pull Request #1894 Closes #1893 (cherry picked from commit 36b449c3852fee3b4cdeb0760058c4265d8a176c) --- .../elasticsearch/core/RequestFactory.java | 26 ++++++++++++------- .../core/ElasticsearchTemplateTests.java | 24 ++++++++++++++--- 2 files changed, 37 insertions(+), 13 deletions(-) diff --git a/src/main/java/org/springframework/data/elasticsearch/core/RequestFactory.java b/src/main/java/org/springframework/data/elasticsearch/core/RequestFactory.java index ca2ca2314..c3db88322 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/RequestFactory.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/RequestFactory.java @@ -760,15 +760,17 @@ class RequestFactory { String indexName = index.getIndexName(); IndexRequest indexRequest; - if (query.getObject() != null) { - String id = StringUtils.isEmpty(query.getId()) ? getPersistentEntityId(query.getObject()) : query.getId(); + Object queryObject = query.getObject(); + + if (queryObject != null) { + String id = StringUtils.isEmpty(query.getId()) ? getPersistentEntityId(queryObject) : query.getId(); // If we have a query id and a document id, do not ask ES to generate one. if (id != null) { indexRequest = new IndexRequest(indexName).id(id); } else { indexRequest = new IndexRequest(indexName); } - indexRequest.source(elasticsearchConverter.mapObject(query.getObject()).toJson(), Requests.INDEX_CONTENT_TYPE); + indexRequest.source(elasticsearchConverter.mapObject(queryObject).toJson(), Requests.INDEX_CONTENT_TYPE); } else if (query.getSource() != null) { indexRequest = new IndexRequest(indexName).id(query.getId()).source(query.getSource(), Requests.INDEX_CONTENT_TYPE); @@ -779,7 +781,8 @@ class RequestFactory { if (query.getVersion() != null) { indexRequest.version(query.getVersion()); - VersionType versionType = retrieveVersionTypeFromPersistentEntity(query.getObject().getClass()); + VersionType versionType = retrieveVersionTypeFromPersistentEntity( + queryObject != null ? queryObject.getClass() : null); indexRequest.versionType(versionType); } @@ -814,15 +817,16 @@ class RequestFactory { IndexRequestBuilder indexRequestBuilder; - if (query.getObject() != null) { - String id = StringUtils.isEmpty(query.getId()) ? getPersistentEntityId(query.getObject()) : query.getId(); + Object queryObject = query.getObject(); + if (queryObject != null) { + String id = StringUtils.isEmpty(query.getId()) ? getPersistentEntityId(queryObject) : query.getId(); // If we have a query id and a document id, do not ask ES to generate one. if (id != null) { indexRequestBuilder = client.prepareIndex(indexName, type, id); } else { indexRequestBuilder = client.prepareIndex(indexName, type); } - indexRequestBuilder.setSource(elasticsearchConverter.mapObject(query.getObject()).toJson(), + indexRequestBuilder.setSource(elasticsearchConverter.mapObject(queryObject).toJson(), Requests.INDEX_CONTENT_TYPE); } else if (query.getSource() != null) { indexRequestBuilder = client.prepareIndex(indexName, type, query.getId()).setSource(query.getSource(), @@ -834,7 +838,8 @@ class RequestFactory { if (query.getVersion() != null) { indexRequestBuilder.setVersion(query.getVersion()); - VersionType versionType = retrieveVersionTypeFromPersistentEntity(query.getObject().getClass()); + VersionType versionType = retrieveVersionTypeFromPersistentEntity( + queryObject != null ? queryObject.getClass() : null); indexRequestBuilder.setVersionType(versionType); } @@ -1695,12 +1700,13 @@ class RequestFactory { return null; } - private VersionType retrieveVersionTypeFromPersistentEntity(Class clazz) { + private VersionType retrieveVersionTypeFromPersistentEntity(@Nullable Class clazz) { MappingContext, ElasticsearchPersistentProperty> mappingContext = elasticsearchConverter .getMappingContext(); - ElasticsearchPersistentEntity persistentEntity = mappingContext.getPersistentEntity(clazz); + ElasticsearchPersistentEntity persistentEntity = clazz != null ? mappingContext.getPersistentEntity(clazz) + : null; VersionType versionType = null; diff --git a/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java b/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java index 9da1dde35..2c99e2fdd 100755 --- a/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java @@ -1129,7 +1129,8 @@ public abstract class ElasticsearchTemplateTests { Collection ids = IntStream.rangeClosed(1, 10).mapToObj(i -> nextIdAsString()).collect(Collectors.toList()); ids.add(referenceId); ids.stream() - .map(id -> getIndexQuery(SampleEntity.builder().id(id).message(sampleMessage).version(System.currentTimeMillis()).build())) + .map(id -> getIndexQuery( + SampleEntity.builder().id(id).message(sampleMessage).version(System.currentTimeMillis()).build())) .forEach(indexQuery -> operations.index(indexQuery, index)); indexOperations.refresh(); @@ -1144,7 +1145,8 @@ public abstract class ElasticsearchTemplateTests { assertThat(searchHits.getTotalHits()).isEqualTo(10); assertThat(searchHits.getSearchHits()).hasSize(5); - Collection returnedIds = searchHits.getSearchHits().stream().map(SearchHit::getId).collect(Collectors.toList()); + Collection returnedIds = searchHits.getSearchHits().stream().map(SearchHit::getId) + .collect(Collectors.toList()); moreLikeThisQuery.setPageable(PageRequest.of(1, 5)); @@ -3794,6 +3796,22 @@ public abstract class ElasticsearchTemplateTests { assertThat(explanation).isNotNull(); } + @Test // #1893 + @DisplayName("should index document from source with version") + void shouldIndexDocumentFromSourceWithVersion() { + + String source = "{\n" + // + " \"answer\": 42\n" + // + "}"; + IndexQuery query = new IndexQueryBuilder() // + .withId("42") // + .withSource(source) // + .withVersion(42L) // + .build(); + + operations.index(query, IndexCoordinates.of(INDEX_NAME_SAMPLE_ENTITY)); + } + // region entities @Document(indexName = INDEX_NAME_SAMPLE_ENTITY) @Setting(shards = 1, replicas = 0, refreshInterval = "-1") @@ -4572,5 +4590,5 @@ public abstract class ElasticsearchTemplateTests { this.text = text; } } - //endregion + // endregion }