【问题标题】:Thrift service default parameterThrift 服务默认参数
【发布时间】:2014-02-01 20:42:57
【问题描述】:

我的问题与问题非常相似 Default arguments with default values in Thrift Python client 从未完全解决(一个答案是猜测,另一个很难理解)。

问题是,您能否为服务方法设置一个默认参数,而无需为每个需要的方法创建一个结构。我有以下 Java 服务,我想用 Thrift 处理程序进行包装

class MyService {
    public void foo(){ foo(false); } 
    public void foo(boolean someAdvancedFeature){...}
}

所以我想创建 Thrift IDL

service MyServiceThrift {
    void foo(),
    void foo(1:bool),
}

但这是无效的,因为您不能有 2 个名为 foo 的方法。所以我尝试了

service MyServiceThrift {
    void foo(1:optional bool someAdvancedFeature = false)
}

但是我得到一个解析错误,说 Cannot use reserved language keyword: "false" 所以我虽然很好,也许我可以让它成为可选的

service MyServiceThrift {
    void foo(1: optional bool someAdvancedFeature)
}

但我收到了警告 optional keyword is ignored in argument lists.,事后看来这很有意义,因为它只是在创建创建接口。

那么,为每个采用可选参数的方法创建一个新的struct 的唯一方法是什么? (是的,您可以将结构重新用于某些方法,但是对于参数的每个排列,我都需要一个,另外,如果一种方法添加了参数而其他方法没有添加参数,那么这会破坏事情的发展)。让用户创建一个(可能为空的)类只是为了将参数传递给一个方法似乎很愚蠢,而且我真的不喜欢必须为我的服务中的每个方法生成/维护一个单独的类的想法。我错过了什么吗?

【问题讨论】:

  • 即使是一年之后,但似乎这个布尔默认值没有记录在任何地方,我很难学会。 thrift 结构中的布尔值(默认)值为 0 或 1,而不是 false 或 true。所以在节俭中它应该是“bool someAdvancedFeature = 0”

标签: java thrift idl


【解决方案1】:

这是一个非常好的问题,因为从技术上讲,结构已经存在 - 在幕后。但是,我担心这种行为就像您所描述的那样,并且 - 至少目前 - 除了可能有类似的解决方法之外别无他法:

enum TriState {
   Unused = 0
   Yes = 1
   No = 2
}

service Foobar {
  void DoIt( 1: TriState someAdvancedFeature)
  void Ints( 1: set<byte> usedArgs, 2: i32 value, 3: string foobarbaz)
}

【讨论】:

  • 呃,这充其量感觉很脏,当您需要 i32 timeout 或某种复杂对象的默认值时会发生什么?
  • 嗯,我想我可以定义一些常量,如 DEFAULT_BOOLEAN、DEFAULT_I32、DEFAULT_OBJECT 等,然后将它们传入。然后在我的处理程序中,我可以检查它们是否传入默认值,然后根据需要进行转换.它将全部包含在一个常量类中,并且不会太麻烦。唯一真正的缺点是它不适用于标记值可能是合法参数的方法
  • 我没说会很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-14
  • 1970-01-01
相关资源
最近更新 更多