java - 如何在java中收集grpc protobuf请求中存在的所有布尔假/真值?

我有一个包含布尔字段的 protobuf 消息。当我将 false 值传递给请求中的布尔字段以及解析请求时,包含 false 值的字段将被忽略。例如下面:

message Features {
  bool enable_config = 1;
  bool enable_logo_on_screen = 2;
  string custom_url = 3;
  bool enable_footer = 4;
}

message UpdateFeaturesRequest {
  Features features = 1;
}

假设 Features 对象已存在于包含以下值的数据库中:

{
  enableConfig: true,enableLogoOnScreen: true,customUrl: "https://custom.url.uk/app",enableFooter: true
}

现在我想要一个可以更新功能的特定字段的 grpc 更新请求,所以当我像下面这样触发 UpdateFeaturesRequest 时:

{
  enableConfig: false,customUrl: "https://custom2.url.hu/app"
}

预期的输出是在 DB 中具有更新的功能对象,例如:

{
  enableConfig: false,customUrl: "https://custom2.url.hu/app",enableFooter: true
}

但不幸的是,我无法检测到 false proto 消息中的 UpdateFeaturesRequest 值。我正在数据库中以 JSON 格式保存功能对象。

所以,当我这样做时: updateFeaturesRequest.getFeatures() 然后布尔假值被忽略。我怎样才能让 UpdateFeaturesRequest.

出现 bool 假值

我必须知道 Json 格式化程序会忽略布尔假值,我们必须执行以下操作:

JsonFormat
   .printer()
   .includingDefaultvalueFields()
   .print(message);

但这也包括 protobuf 消息中存在的其他默认值。我只想更新 UpdateFeaturesRequest 中存在的特定字段。有人可以帮忙吗。

lz245548622 回答:java - 如何在java中收集grpc protobuf请求中存在的所有布尔假/真值?

在语言的 proto3 版本中(您必须使用它,因为我在您的示例消息中没有看到 optional 关键字),标量字段之间不再有任何区别它不存在,并且标量字段已设置为其默认值。引用Default Values chapter of the Language Guide

请注意,对于标量消息字段,一旦解析了消息,就无法判断字段是否明确设置为默认值(例如,布尔值是否设置为 false)或只是未设置为全部:在定义消息类型时应该牢记这一点。例如,如果您不希望默认情况下也发生该行为,则不要设置在设置为 false 时开启某些行为的布尔值。

因此,各种语言 API 通常也不会有这种区别。如果您想知道 enableConfig 是否默认为 false 或已明确设置为 false,则需要重新设计消息。

最常见的两种方法可能是:

  1. 提供您设置为 boolsecond true 字段以表示已设置第一个字段的值。
  2. 使用 google.protobuf.BoolValue“众所周知的类型”,它为 bool 字段提供简单的包装消息。对于消息类型的字段,可以区分未设置的字段和已显式设置的字段。

您也可以考虑执行选项 2,但使用自定义消息类型,例如 FeatureFlagBooleanFeature,以便更清楚地说明含义。

(较旧的proto2 版本的语言确实区分了“未设置”和“设置为默认值”,并提供了访问器——“hazzers”——让你查询一个字段是否明确设置与否。)

本文链接:https://www.f2er.com/44537.html

大家都在问