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