2015-04-21 3 views
0

Есть ли способ добавить информацию о иерархии типов в генерируемые типы исключений для Java.Иерархия типа исключения в thrift/java

Я хочу определить некоторый общий набор исключений, которые люди могут повторно использовать. Часто случается, что клиенты вместо обработки отдельных исключений хотят обрабатывать группу исключений. Например, скажем, клиент java хочет поймать все плохие запросы и распечатать сообщение об исключении. Клиент не хочет обрабатывать отдельные исключения, такие как TooBigParamException, MissingParamException и т. Д., Но вместо этого просто хочет поймать родителя из них: BadRequestException. Есть ли способ изменить сгенерированные коды TooBigParamException, MissingParamException и т. Д., Чтобы добавить расширение?

Я попробовал Facebook swift (Java -> Преобразование Thrift), но похоже, что он не работает без сбоев с помощью Apache.

ответ

0

Я нашел одно достойное решение. Хотя я бы не сказал, что в этом нет никаких хаков.

Когда я начал, было только 2 варианта со мной:

  1. написать код Java, а затем я могу генерировать IDL с помощью FB Swift, но типы Java, написанные мной, не будет быть совместимым с Thrift, поскольку они не будут содержать методы read() и write() , требуемые Thrift.
  2. Сначала напишите idl, я могу сгенерировать классы java . Но они не будут содержать ни одной иерархии типов, а также, они будут изменчивыми, . Я не предпочитаю изменчивые объекты.

Я смог обойти эти проблемы, объединив вышеприведенные 2. Сначала я написал исключения Java, а затем сгенерировал IDL с помощью swift. Затем сгенерирована другая версия исключений java из idl. Я использовал modelmapper для преобразования между моими исходными типами Java и сгенерированными типами Java. В моем сервисном ядре используется первая версия исключений и мой сервисный уровень, который преобразует их в свою экономную версию с помощью modelmapper.

1

В текущем состоянии Apache Thrift не поддерживает наследование, ни с struct/union, ни с exception. Я предполагаю, что это потому, что существуют языки, где наследование будет слишком сложным для реализации, потому что оно не является частью языка.

Одним из решений, которое приходит мне на ум, является преобразование исключений в структуры, имеющие только одно исключение Thrift и 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, что может быть полезно.

Смежные вопросы