elasticsearch出现co.elastic.clients.util.MissingRequiredPropertyException: Missing required property报错

目录

报错情况:co.elastic.clients.util.MissingRequiredPropertyException: Missing required property

报错分析:官方bug

解决方法

第一种:升级新版本

第二种:暂时禁用对违规对象的属性检查

第三种:回退到老版本

最后


报错情况: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 对象,但尚未设置必需的属性,则会抛出 a MissingRequiredPropertyException 。这既适用于请求对象,也适用于 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

响应中的 MissingRequiredPropertyException |Elasticsearch Java API 客户端 [8.14] |弹性的 --- MissingRequiredPropertyException in a response | Elasticsearch Java API Client [8.14] | Elastic

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值