响应中的 MissingRequiredPropertyException

编辑

响应中的 MissingRequiredPropertyException

编辑

Java API 客户端区分可选属性和必需属性。可选属性使用 @Nullable 注解标记。

当构建 API 对象并且未设置必需属性时,会抛出 MissingRequiredPropertyException。 这既适用于您的应用程序构建的请求对象,也适用于 Elasticsearch 返回的响应对象,因此您可以确保没有 @Nullable 注解的属性永远不会是 null

但是,Elasticsearch API 规范 中可能存在错误,其中响应对象的属性被错误地标记为必需,从而在反序列化响应时导致 MissingRequiredPropertyException。 如果发生这种情况,您可以按以下方式解决它

  • 请确保您使用最新版本的 Java API 客户端。该问题可能已被修复。
  • 如果最新版本仍然存在此问题,请提交一个 issue,以便我们在下一个版本中修复它。请帮助我们改进 Java API 客户端。
  • 临时禁用有问题的请求的必需属性检查

这是一种解决方法。请不要将其视为永久解决方案,并请提交一个 issue,以便在未来的版本中修复该问题。

    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
}