java - Thrift服务默认参数

标签 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.,这在事后看来是有道理的,因为它只是在创建接口(interface)。

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

最佳答案

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

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)
}

关于java - Thrift服务默认参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21102543/

相关文章:

java - 决策树执行

python - Thrift Python 客户端中具有默认值的默认参数

java - 如何在 Java 服务器中使用分层节俭传输

c++ - apache thrift 是否支持函数变量作为参数?

javascript - JavaScript/HTML5 的机器可读 (WebIDL) 引用?

java - 如何在 Spring MVC 2.5 应用程序中更改 HTTP OPTIONS 请求的响应?

java - Android Studio 请求应用程序权限无法编译显示错误 : array dimension missing

java - COMPSs - 节点已填充错误

java - 循环遍历maven中的特定资源文件生成源

algorithm - 如何找到共振行星