Я использую клиент apache cxf 3.2.2 в автономном приложении Java для вызова некоторых веб-сервисов мыла.
Попытка получить код ошибки мыла и строку ошибки в в одну сторону операция, но безуспешно.
Я определил собственный перехватчик, но он никогда не достигает handleMessage
IncomingFaultInterceptor faultInterceptor = new IncomingFaultInterceptor();
cxfEndpoint.getInFaultInterceptors().add(faultInterceptor);
Код из кастомного перехватчика
public class IncomingFaultInterceptor extends AbstractSoapInterceptor {
public IncomingFaultInterceptor(){
super(Phase.RECEIVE);
}
@Override
public void handleMessage(SoapMessage message) throws Fault {
if(message != null){
/* log fault string , fault code*/
}
}
}
Исключение, которое я получаю, находится в MessageSenderEndingInterceptor (который находится в фазе PREPARE_SEND).
Выдает новую ошибку с текстом «Не удалось отправить сообщение». Что странно, так это то, что перехвачено исключение: «HTTP-ответ« 500: внутренняя ошибка сервера »при общении с ...»
Если я отправлю тот же запрос с soapui, я увижу код ошибки и строку ошибки.
HTTP/1.1 500 Internal Server Error
Accept: text/xml, text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
SOAPAction: ""
Content-Type: text/xml;charset=utf-8
Content-Length: 396
Date: Thu, 05 Apr 2018 15:32:27 GMT
Connection: close
Server: Test
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<faultcode xmlns:ns0="http://company.com/services/fault">THE_FAULT_CODE</faultcode>
<faultstring xml:lang="en">THE_FAULT_STRING</faultstring>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Любые идеи или что я могу сделать, чтобы получить код ошибки и строку ошибки? Любая хорошая документация клиентских перехватчиков в cxf?
Обновление:
Кажется, невозможно получить код ошибки и строку ошибки в односторонняя работа с клиентом cxf, так как сервер не соответствует стандартам SOAP и WSI.
Во всяком случае, мне не удалось обойти исключение и зарегистрировать строку ошибки и код ошибки. Пробовал комментировать одностороннюю аннотацию в сгенерированном коде, но перехватчик так и не запускается. Я не смог найти хороших примеров того, как реализовать перехватчик на стороне клиента для обработки ошибок.
Дополнительная информация:
Спецификация WS-I для односторонних операций . Из определения «...Например, HTTP-ответ «500 Internal Server Error», содержащий ошибку, не может быть возвращен в этой ситуации».
Кроме того, ошибка «Не удалось отправить сообщение» сбивает с толку, поскольку запрос был отправлен, но о нем уже сообщается здесь