2015-04-21 27 views
0

是否有将类型层次结构信息添加到为Java生成节俭异常类型的方法?thrift/java中的异常类型层次结构

我想定义一些常用设置例外,人们可以重用。通常情况下,客户端不是处理个别异常,而是想处理一组异常。例如,假设一个java客户端想要捕获所有错误的请求并打印异常消息。客户端不想处理像TooBigParamException,MissingParamException等单个异常,但是只是想要捕获这些异常的父代:BadRequestException。有没有办法改变生成的代码TooBigParamException,MissingParamException等添加一个扩展关系?

我想Facebook的迅速(爪哇 - >节俭的转换),但它看起来像它不与Apache节俭无缝协作。

回答

0

我找到了一个不错的解决方案。虽然我不会说那里没有黑客。

当我开始,当时只有2个选项我:

  1. 首先编写Java代码,那么我就可以使用FB 斯威夫特产生的IDL,但我写的Java类型,不会与Thrift兼容 ,因为它们不包含Thrift要求的read()和write()方法 。
  2. 先编写IDL,我可以生成Java类从它 。但它们不会包含任何类型层次结构,并且它们也是可变的。我不喜欢可变对象。

我能够解决这些问题,通过结合上述2.我首先写了Java异常,然后使用swift生成IDL。然后从idl生成另一个Java异常版本。我使用modelmapper在我的原始java类型和生成的java类型之间进行转换。我的服务核心使用异常的第一个版本和我的service-thrir层,使用modelmapper将它们转换为节点版本。

1

在当前状态下,Apache Thrift不支持继承,既不支持struct/union也不支持exception。我的猜测是,这是因为有些语言在那里继承太复杂,不能实现,因为它不是语言的一部分。这在我脑海

一种解决方案是将异常转换成结构,只有一个例外,节俭和union异常的数据转换成一个。客户端捕获“常见”异常并重新提出该包中的任何内容。

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,其可以是有帮助。