Skip to content

Commit 9394030

Browse files
authored
Fix NPE on IndexQuery with source and version. (#1894)
Closes #1893
1 parent 1c8e0e0 commit 9394030

File tree

2 files changed

+32
-10
lines changed

2 files changed

+32
-10
lines changed

src/main/java/org/springframework/data/elasticsearch/core/RequestFactory.java

+16-10
Original file line numberDiff line numberDiff line change
@@ -700,15 +700,17 @@ public IndexRequest indexRequest(IndexQuery query, IndexCoordinates index) {
700700
String indexName = index.getIndexName();
701701
IndexRequest indexRequest;
702702

703-
if (query.getObject() != null) {
704-
String id = StringUtils.isEmpty(query.getId()) ? getPersistentEntityId(query.getObject()) : query.getId();
703+
Object queryObject = query.getObject();
704+
705+
if (queryObject != null) {
706+
String id = StringUtils.isEmpty(query.getId()) ? getPersistentEntityId(queryObject) : query.getId();
705707
// If we have a query id and a document id, do not ask ES to generate one.
706708
if (id != null) {
707709
indexRequest = new IndexRequest(indexName).id(id);
708710
} else {
709711
indexRequest = new IndexRequest(indexName);
710712
}
711-
indexRequest.source(elasticsearchConverter.mapObject(query.getObject()).toJson(), Requests.INDEX_CONTENT_TYPE);
713+
indexRequest.source(elasticsearchConverter.mapObject(queryObject).toJson(), Requests.INDEX_CONTENT_TYPE);
712714
} else if (query.getSource() != null) {
713715
indexRequest = new IndexRequest(indexName).id(query.getId()).source(query.getSource(),
714716
Requests.INDEX_CONTENT_TYPE);
@@ -719,7 +721,8 @@ public IndexRequest indexRequest(IndexQuery query, IndexCoordinates index) {
719721

720722
if (query.getVersion() != null) {
721723
indexRequest.version(query.getVersion());
722-
VersionType versionType = retrieveVersionTypeFromPersistentEntity(query.getObject().getClass());
724+
VersionType versionType = retrieveVersionTypeFromPersistentEntity(
725+
queryObject != null ? queryObject.getClass() : null);
723726
indexRequest.versionType(versionType);
724727
}
725728

@@ -754,15 +757,16 @@ public IndexRequestBuilder indexRequestBuilder(Client client, IndexQuery query,
754757

755758
IndexRequestBuilder indexRequestBuilder;
756759

757-
if (query.getObject() != null) {
758-
String id = StringUtils.isEmpty(query.getId()) ? getPersistentEntityId(query.getObject()) : query.getId();
760+
Object queryObject = query.getObject();
761+
if (queryObject != null) {
762+
String id = StringUtils.isEmpty(query.getId()) ? getPersistentEntityId(queryObject) : query.getId();
759763
// If we have a query id and a document id, do not ask ES to generate one.
760764
if (id != null) {
761765
indexRequestBuilder = client.prepareIndex(indexName, type, id);
762766
} else {
763767
indexRequestBuilder = client.prepareIndex(indexName, type);
764768
}
765-
indexRequestBuilder.setSource(elasticsearchConverter.mapObject(query.getObject()).toJson(),
769+
indexRequestBuilder.setSource(elasticsearchConverter.mapObject(queryObject).toJson(),
766770
Requests.INDEX_CONTENT_TYPE);
767771
} else if (query.getSource() != null) {
768772
indexRequestBuilder = client.prepareIndex(indexName, type, query.getId()).setSource(query.getSource(),
@@ -774,7 +778,8 @@ public IndexRequestBuilder indexRequestBuilder(Client client, IndexQuery query,
774778

775779
if (query.getVersion() != null) {
776780
indexRequestBuilder.setVersion(query.getVersion());
777-
VersionType versionType = retrieveVersionTypeFromPersistentEntity(query.getObject().getClass());
781+
VersionType versionType = retrieveVersionTypeFromPersistentEntity(
782+
queryObject != null ? queryObject.getClass() : null);
778783
indexRequestBuilder.setVersionType(versionType);
779784
}
780785

@@ -1640,12 +1645,13 @@ private String getPersistentEntityId(Object entity) {
16401645
return null;
16411646
}
16421647

1643-
private VersionType retrieveVersionTypeFromPersistentEntity(Class<?> clazz) {
1648+
private VersionType retrieveVersionTypeFromPersistentEntity(@Nullable Class<?> clazz) {
16441649

16451650
MappingContext<? extends ElasticsearchPersistentEntity<?>, ElasticsearchPersistentProperty> mappingContext = elasticsearchConverter
16461651
.getMappingContext();
16471652

1648-
ElasticsearchPersistentEntity<?> persistentEntity = mappingContext.getPersistentEntity(clazz);
1653+
ElasticsearchPersistentEntity<?> persistentEntity = clazz != null ? mappingContext.getPersistentEntity(clazz)
1654+
: null;
16491655

16501656
VersionType versionType = null;
16511657

src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchTemplateTests.java

+16
Original file line numberDiff line numberDiff line change
@@ -3576,6 +3576,22 @@ void shouldSetScriptedFieldsOnImmutableObjects() {
35763576
assertThat(foundEntity.getScriptedRate()).isEqualTo(84.0);
35773577
}
35783578

3579+
@Test // #1893
3580+
@DisplayName("should index document from source with version")
3581+
void shouldIndexDocumentFromSourceWithVersion() {
3582+
3583+
String source = "{\n" + //
3584+
" \"answer\": 42\n" + //
3585+
"}";
3586+
IndexQuery query = new IndexQueryBuilder() //
3587+
.withId("42") //
3588+
.withSource(source) //
3589+
.withVersion(42L) //
3590+
.build();
3591+
3592+
operations.index(query, IndexCoordinates.of(indexNameProvider.indexName()));
3593+
}
3594+
35793595
// region entities
35803596
@Document(indexName = "#{@indexNameProvider.indexName()}")
35813597
@Setting(shards = 1, replicas = 0, refreshInterval = "-1")

0 commit comments

Comments
 (0)