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