Компонент CXF верблюда не улавливает onException (Exception.class)

У меня есть веб-сервис camel-cxf. Я использую для обработки всех ошибок SOAP в механизме перехватчика ошибок SOAP CXF. Это хорошо работает.

Я подумал, что лучше обрабатывать исключение, созданное на уровне Camel на том же уровне, и написал простой сценарий onException, например:

onException (Exception.class). to ("прямой: MyWSExceptionHandler");

Всякий раз, когда генерируется настраиваемое исключение, я ожидал, что сработает onException (помните, что у меня тоже есть перехватчик ошибок SOAP), но это не так. CXF берет верх, и сообщение проходит через перехватчики, а не через верблюжий путь.

Это ожидаемый способ или я что-то делаю не так?

Мой перехватчик неисправностей CXF выглядит так:

@Component("SOAPFaultInterceptor")
public class SOAPFaultInterceptor extends AbstractPhaseInterceptor {

    public SOAPFaultInterceptor() {
        super(Phase.MARSHAL);
    }

    public void handleMessage(Message message) throws Fault {
     // The message is coming here directly, instead of going to the route defined by onException.
    }
}

Подскажите, пожалуйста, как это исправить? Я не хочу, чтобы исключение, созданное на слое Camel, оставляло этот слой без обработки.

Заранее спасибо.


person Anoop Hallimala    schedule 10.05.2013    source источник


Ответы (1)


OnException верблюда срабатывает только при возникновении исключения. Ошибка SOAP отображается как сообщение с флагом ошибки = true.

Что вы можете сделать, так это установить handleFault = true в CamelContext, тогда он превратит сообщения об ошибках SOAP в исключение, на которое может реагировать onException.

person Claus Ibsen    schedule 10.05.2013
comment
Спасибо тебе большое, Клаус. Я помню, как читал об этом сейчас. Я восхищаюсь вашей работой с Camel, и я полагаю, что это делает меня фанатом :) Отличная работа, действительно .. Спасибо. - person Anoop Hallimala; 11.05.2013
comment
Привет, Клаус, это не работает. У меня очень сложный маршрут Route1- ›Route2-› Route3 (здесь возникает исключение). Я бросаю экземпляр WebApplicationException, который является исключением времени выполнения. Я разработал глобальное onException (Exception.class, MyWSException.class) И локальное. onCompletion запускается, хотя я установил HandleFault (true). Я не понимаю, почему запускается onCompletion, хотя явно должно быть onException. Пожалуйста, направьте. - person Anoop Hallimala; 17.05.2013
comment
Привет, я столкнулся с очень похожей проблемой. Я использую API Apache Camel 2.12.2 для веб-службы CXF. Я установил handleFault = true для camelContext, у меня есть .doTry () с .doCatch () вокруг вызова .to () моего маршрута веб-службы, и все же я не могу самостоятельно обрабатывать SOAPFaults в конфигурациях маршрута моей веб-службы. Я также пробовал .errorHandler (deadLetterChannel (wmq: SOME_QUEUE)), но все же, похоже, только PhaseInterceptorChain обрабатывает сбои. Действительно ли этот механизм работает так, как ожидалось? Есть ли где-нибудь примеры, демонстрирующие работу этого механизма handleFault = true? - person Going Bananas; 08.05.2014