Closed
Description
Java API client version
8.15.1
Java version
17
Elasticsearch Version
8.15.1
Problem description
Hey! I'm running into a MissingRequiredPropertyException
when trying to execute a ForceMerge request with wait_for_completion
set to false
.
This code execution:
ElasticsearchClient esClient = new ElasticsearchClient(transport);
ForcemergeResponse forcemergeResponse = esClient.indices().forcemerge(fmr -> fmr
.index("index1")
.maxNumSegments(1L)
.waitForCompletion(false));
throws with this detailed stack trace:
co.elastic.clients.transport.TransportException: node: https://localhost:9200/, status: 200, [es/indices.forcemerge] Failed to decode response
at co.elastic.clients.transport.ElasticsearchTransportBase.decodeTransportResponse(ElasticsearchTransportBase.java:404)
at co.elastic.clients.transport.ElasticsearchTransportBase.getApiResponse(ElasticsearchTransportBase.java:363)
at co.elastic.clients.transport.ElasticsearchTransportBase.performRequest(ElasticsearchTransportBase.java:147)
at co.elastic.clients.elasticsearch.indices.ElasticsearchIndicesClient.forcemerge(ElasticsearchIndicesClient.java:937)
at co.elastic.clients.elasticsearch.indices.ElasticsearchIndicesClient.forcemerge(ElasticsearchIndicesClient.java:953)
at ElasticsearchClientServer.main(ElasticsearchClientServer.java:98)
Caused by: co.elastic.clients.util.MissingRequiredPropertyException: Missing required property 'ForcemergeResponse.shards'
at co.elastic.clients.util.ApiTypeHelper.requireNonNull(ApiTypeHelper.java:76)
at co.elastic.clients.elasticsearch._types.ShardsOperationResponseBase.<init>(ShardsOperationResponseBase.java:68)
at co.elastic.clients.elasticsearch.indices.forcemerge.ForceMergeResponseBody.<init>(ForceMergeResponseBody.java:66)
at co.elastic.clients.elasticsearch.indices.ForcemergeResponse.<init>(ForcemergeResponse.java:59)
at co.elastic.clients.elasticsearch.indices.ForcemergeResponse.<init>(ForcemergeResponse.java:55)
at co.elastic.clients.elasticsearch.indices.ForcemergeResponse$Builder.build(ForcemergeResponse.java:90)
at co.elastic.clients.elasticsearch.indices.ForcemergeResponse$Builder.build(ForcemergeResponse.java:73)
at co.elastic.clients.json.ObjectBuilderDeserializer.deserialize(ObjectBuilderDeserializer.java:80)
at co.elastic.clients.json.DelegatingDeserializer$SameType.deserialize(DelegatingDeserializer.java:43)
at co.elastic.clients.transport.ElasticsearchTransportBase.decodeTransportResponse(ElasticsearchTransportBase.java:399)
... 5 more
whereas if I set waitForCompletion
to true
, the java client is able to parse the response back from server correctly:
ForcemergeResponse: {"_shards":{"failed":0.0,"successful":2.0,"total":2.0}}
This might be happening because based on the API spec, ForcemergeResponse
extends ShardsOperationResponseBase
which requires _shard
to always be present in raw JSON response, which is not the case when wait_for_completion
is set to true. In that case, we receive the optional parameter task
as pointed in the docs as well.