我的问题和问题很相似 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/