目录
报错情况:co.elastic.clients.util.MissingRequiredPropertyException: Missing required property
报错情况:co.elastic.clients.util.MissingRequiredPropertyException: Missing required property
在java client客户端使用elasticsearch时出现Missing required property要求配置缺失的报错
例如在elasticsearch 8.7.0通过查询删除DeleteByQuery并设置为异执行后就会出现这一报错co.elastic.clients.util.MissingRequiredPropertyException: Missing required property 'DeleteByQueryResponse.throttledMillis'
at co.elastic.clients.util.ApiTypeHelper.requireNonNull(ApiTypeHelper.java:76)
at co.elastic.clients.elasticsearch.core.DeleteByQueryResponse.<init>(DeleteByQueryResponse.java:118)
at co.elastic.clients.elasticsearch.core.DeleteByQueryResponse.<init>(DeleteByQueryResponse.java:59)
at co.elastic.clients.elasticsearch.core.DeleteByQueryResponse$Builder.build(DeleteByQueryResponse.java:598)
at co.elastic.clients.elasticsearch.core.DeleteByQueryResponse$Builder.build(DeleteByQueryResponse.java:364)
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.rest_client.RestClientTransport.decodeResponse(RestClientTransport.java:377)
at co.elastic.clients.transport.rest_client.RestClientTransport.
报错分析:官方bug
根据官方对MissingRequiredPropertyException这一异常的解释
Java API 客户端区分可选属性和必需属性。可选属性标有
@Nullable
批注。如果生成了 API 对象,但尚未设置必需的属性,则会抛出 aMissingRequiredPropertyException
。这既适用于请求对象,也适用于 Elasticsearch返回的响应对象。但是,Elasticsearch API 规范中可能存在错误,其中错误地需要响应对象的属性,从而导致在反序列化响应时出现错误
MissingRequiredPropertyException
根据这个解释就很明显了,官方的部分版本存在bug!!!
如果是请求对象内报出这个异常,先排查下代码中是否有必需属性参数未设置
但如果是响应对象报出这个异常,基本可以怀疑是在使用的版本上有bug官方未修复导致的
解决方法
第一种:升级新版本
博主在报错情况举例的报错场景出现在8.7.0版本中,翻了下github的issue区,官方已承认是bug造成的,并且在8.8.2版本中将该问题修复
所以碰到问题的,可以尝试升级到相对新一点的版本,官方估计已将问题修复
第二种:暂时禁用对违规对象的属性检查
ApiTypeHelper.DANGEROUS_disableRequiredPropertiesCheck(true);
SomeRequest request = SomeRequest.of(...);
SomeResponse response = esClient.someApi(request);
ApiTypeHelper.DANGEROUS_disableRequiredPropertiesCheck(false);
DANGEROUS_disableRequiredPropertiesCheck
方法禁用当前线程上所需的属性检查,以及异步请求中的响应反序列化
如果不方便升级版本,可以尝试能否使用属性检查禁用的方式解决问题
ps:博主针对 Missing required property 'DeleteByQueryResponse.throttledMillis' 这一属性缺失报错尝试过设置,但因为这个reponse里的throttledMillis被设置为primitive long类型,无法生效
java.lang.NullPointerException: Cannot invoke "java.lang.Long.longValue()" because the return value of "co.elastic.clients.util.ApiTypeHelper.requireNonNull(Object, Object, String)" is null
at co.elastic.clients.elasticsearch.core.DeleteByQueryResponse.<init>(DeleteByQueryResponse.java:118)
at co.elastic.clients.elasticsearch.core.DeleteByQueryResponse.<init>(DeleteByQueryResponse.java:59)
at co.elastic.clients.elasticsearch.core.DeleteByQueryResponse$Builder.build(DeleteByQueryResponse.java:598)
at co.elastic.clients.elasticsearch.core.DeleteByQueryResponse$Builder.build(DeleteByQueryResponse.java:364)
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.rest_client.RestClientTransport.decodeResponse(RestClientTransport.java:328)
at co.elastic.clients.transport.rest_client.RestClientTransport.getHighLevelResponse(RestClientTransport.java:294)
at co.elastic.clients.transport.rest_client.RestClientTransport.performRequest(RestClientTransport.java:147)
at co.elastic.clients.elasticsearch.ElasticsearchClient.deleteByQuery(ElasticsearchClient.java:568)
如果是其他属性引起的报错,可以尝试这一方法能否生效
第三种:回退到老版本
类似第一种,回退到没有出现这一问题的es老版本同样可解决问题
最后
这一报错较特殊,并非es java客户端在用户侧日常使用不当导致的问题,而是elasticsearch官方埋下的坑,除了第二种方式能暂时解决部分属性缺失的问题外,另外两种方法都要通过整体版本改变实现,在实际工程上可能成本较高
目前公开网络上能找到出现这一问题的操作不多,能规避还是尽量规避吧
参考:
DeleteByQuery cannot be used · Issue #413 · elastic/elasticsearch-java · GitHub