From 8eab126d22c02af3c087c6e96921448bced39971 Mon Sep 17 00:00:00 2001 From: Peter-Josef Meisch Date: Fri, 6 Aug 2021 19:34:00 +0200 Subject: [PATCH] Fix NPE on IndexQuery with source and version. Closes #1893 --- .../elasticsearch/core/RequestFactory.java | 26 ++++++++++++------- .../core/ElasticsearchTemplateTests.java | 16 ++++++++++++ 2 files changed, 32 insertions(+), 10 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 4451ae9c0..6981d5905 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/RequestFactory.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/RequestFactory.java @@ -700,15 +700,17 @@ public IndexRequest indexRequest(IndexQuery query, IndexCoordinates index) { 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); @@ -719,7 +721,8 @@ public IndexRequest indexRequest(IndexQuery query, IndexCoordinates index) { 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); } @@ -754,15 +757,16 @@ public IndexRequestBuilder indexRequestBuilder(Client client, IndexQuery query, 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(), @@ -774,7 +778,8 @@ public IndexRequestBuilder indexRequestBuilder(Client client, IndexQuery query, 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); } @@ -1640,12 +1645,13 @@ private String getPersistentEntityId(Object entity) { 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 831de08e8..cdcc2197d 100755 --- a/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java @@ -3576,6 +3576,22 @@ void shouldSetScriptedFieldsOnImmutableObjects() { assertThat(foundEntity.getScriptedRate()).isEqualTo(84.0); } + @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(indexNameProvider.indexName())); + } + // region entities @Document(indexName = "#{@indexNameProvider.indexName()}") @Setting(shards = 1, replicas = 0, refreshInterval = "-1")