Thrift服务默认参数

时间:2014-01-13 22:21:12

标签: java thrift idl

我的问题与这个问题非常相似 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的唯一方法吗? (是的,你可以为某些方法重新使用结构,但是我需要一个参数的每个排列,如果一个方法添加了一个参数而另一个方法没有参数,那么就会破坏一些方法)。让用户创建一个(可能是空的)类只是为了将参数传递给方法似乎很愚蠢,我真的不喜欢必须为我的服务中的每个方法生成/维护一个单独的类。我错过了什么吗?

1 个答案:

答案 0 :(得分: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)
}