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 может реагировать.