响应中的 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 }