【问题标题】:How to collect all boolean false/true values present in grpc protobuf request in java?java - 如何在java中收集grpc protobuf请求中存在的所有布尔假/真值?
【发布时间】:2021-07-24 06:15:14
【问题描述】:

我有一个包含布尔字段的 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,
  enableLogoOnScreen: true,
  customUrl: "https://custom2.url.hu/app",
  enableFooter: true
}

但不幸的是,我无法检测到 false 原始消息中的 false 值。我将要素对象以 JSON 格式保存在数据库中。

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

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

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

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

【问题讨论】:

    标签: java-8 protocol-buffers grpc-java


    【解决方案1】:

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

    请注意,对于标量消息字段,一旦解析了消息,就无法判断一个字段是显式设置为默认值(例如布尔值是否设置为false)还是根本没有设置:在定义消息类型时应牢记这一点。例如,如果您不希望默认情况下也发生该行为,则不要使用设置为 false 时打开某些行为的布尔值。

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

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

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

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

    (旧的 proto2 语言版本确实区分了“未设置”和“设置为默认值”,并提供了访问器 - “hazzers” - 让您可以查询字段是否显式设置与否。)

    【讨论】:

    • 谢谢。这让我在false bool vars 没有按预期出现后发疯。
    猜你喜欢
    • 1970-01-01
    • 2011-01-23
    • 2020-01-05
    • 2019-08-08
    • 1970-01-01
    • 1970-01-01
    • 2014-02-28
    • 2014-12-10
    • 1970-01-01
    相关资源
    最近更新 更多