CXF-компонент верблюда не перехватывает OnException(Exception.class)

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

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

OnException(Exception.class). к ("прямой:MyWSExceptionHandler");

Всякий раз, когда выдается пользовательское исключение, я ожидал срабатывания onException (помните, у меня также есть перехватчик SOAP Fault Interceptor), но это не так. Приходит 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 исключение оставляло этот слой без обработки.

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

1 ответ

Решение

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

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

Другие вопросы по тегам