2015-04-21 28 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,其可以是有幫助。