是否有一种方法可以为Java生成的thrift异常类型添加类型层次结构信息。
我想定义一些常见的异常,人们可以重复使用。经常发生客户端而不是处理个别异常,想要处理一组异常。例如,假设一个java客户端想要捕获所有错误请求并打印异常消息。客户端不希望处理像TooBigParamException,MissingParamException等个别异常,而只是想捕获这些异常的父类:BadRequestException。有没有办法更改生成的TooBigParamException,MissingParamException等代码以添加扩展关系?
我试过Facebook swift(Java - > Thrift转换),但看起来它无法与Apache thrift无缝协作。
答案 0 :(得分:2)
在当前状态下,Apache Thrift既不支持继承,也不支持struct
/ union
或exception
。我的猜测是,这是因为有些语言的继承太复杂而无法实现,因为它实际上并不是语言的一部分。
我想到的一个解决方案是将异常转换为结构,只有一个Thrift异常和union
异常数据。客户端抓住了#34;普通"异常并重新提出该包中的任何内容。
struct OverflowError {
1: double operator1
2: double operator2
3: string operation
}
struct DivByZeroError {
1: double numerator
}
union AllTheErrors {
1: OverflowError over
2: DivByZeroError div0
// more to come
}
exception MathError {
1: AllTheErrors theError
}
service ExceptionalCalculator {
double Add(1: double arg1, 2: double arg2) throws (1: MathError mex)
double Subtract(1: double arg1, 2: double arg2) throws (1: MathError mex)
double Divide(1: double arg1, 2: double arg2) throws (1: MathError mex)
double PriceOfDowJonesNextThursday() throws (1: MathError mex)
}
涉及相当多的工作,但可能是一个解决方案。
还有一个related discussion about protobuf,也可能会有所帮助。
答案 1 :(得分:0)
我找到了一个不错的解决方案。虽然我不会说那里没有黑客。
当我开始时,我只有两个选择:
通过结合上面的内容,我能够解决这些问题2.我首先编写了java异常,然后使用swift生成了IDL。然后从idl生成另一个版本的java异常。我使用modelmapper在原始java类型和生成的java类型之间进行转换。我的service-core使用第一个异常版本和我的service -thrift层,使用modelmapper将它们转换为thrift版本。