响应中的 MissingRequiredPropertyException
编辑响应中的 MissingRequiredPropertyException
编辑
Java API 客户端区分可选属性和必填属性。可选属性使用 @Nullable
注释标记。
构建 API 对象且未设置必填属性时,会抛出 MissingRequiredPropertyException
。这适用于应用程序构建的请求对象和 Elasticsearch 返回的响应对象,因此您可以确信没有 @Nullable
注释的属性永远不会为 null
。
但是,Elasticsearch API 规范 中可能存在错误,导致响应对象的属性被错误地设置为必填项,从而在反序列化响应时导致 MissingRequiredPropertyException
。如果发生这种情况,您可以按照以下方法解决
- 确保使用最新版本的 Java API 客户端。该问题可能已得到修复。
- 如果最新版本中仍然存在此问题,请提交问题,以便我们可以在下一个版本中修复它。请帮助我们改进 Java API 客户端。
- 暂时禁用对错误请求的必填属性检查
这是一种解决方法。不要将其视为永久解决方案,请提交问题,以便在将来的版本中修复此问题。
ApiTypeHelper.DANGEROUS_disableRequiredPropertiesCheck(true); SomeRequest request = SomeRequest.of(...); SomeResponse response = esClient.someApi(request); ApiTypeHelper.DANGEROUS_disableRequiredPropertiesCheck(false); // Do something with response }
DANGEROUS_disableRequiredPropertiesCheck
方法禁用对当前线程的必填属性检查,以及对异步请求中响应反序列化的检查。顾名思义,这样做很危险,因为它消除了非 @Nullable
属性的保证。这是在问题得到解决之前的临时解决方法。
请注意,此方法的结果是一个 AutoCloseable
对象,它会将必填属性检查重置为之前的设置。因此,您可以在 try-with-resource 块中使用它,如下所示
try (ApiTypeHelper.DisabledChecksHandle h = ApiTypeHelper.DANGEROUS_disableRequiredPropertiesCheck(true)) { SomeRequest request = SomeRequest.of(...); SomeResponse response = esClient.someApi(request); // Do something with response }