Обработка ошибок мыла клиента Apache CXF

Я использую клиент 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», содержащий ошибку, не может быть возвращен в этой ситуации».

Кроме того, ошибка «Не удалось отправить сообщение» сбивает с толку, поскольку запрос был отправлен, но о нем уже сообщается здесь


person Carlos    schedule 05.04.2018    source источник
comment
Посмотрите, поможет ли это cxf.547215.n5.nabble. com/CXF-Fault-Response-Code-td566788.html   -  person Tarun Lalwani    schedule 11.04.2018
comment
привет @TarunLalwani, проблема у меня на стороне клиента (я вызываю службы).   -  person Carlos    schedule 11.04.2018
comment
вы получили какие-либо решения?   -  person Ganesh Gudghe    schedule 31.05.2019
comment
@ganeshGudghe, к сожалению, не с клиентом apache cxf. Я надеялся, что какой-нибудь разработчик библиотеки может помочь, но не повезло. Я предлагаю попробовать другую библиотеку или перейти на более низкий уровень и вызвать напрямую (посмотрите класс HttpURLConnection). С этим классом и потреблением потока в ответе вы добьетесь успеха. Забудьте об удобстве использования объектов, вам придется строить строку со всем запросом мыла.   -  person Carlos    schedule 31.05.2019


Ответы (1)


Не понимаю, зачем вы делаете свой перехватчик.

посмотрите здесь: http://cxf.apache.org/docs/developing-a-consumer.html

Если вы явно описываете ошибку в своем WSDL, генерируется класс ошибки, и вы можете просто поймать его.

Здесь вы можете указать сообщение об ошибке.

<wsdl:operation name="pingMe">
    <wsdl:input name="pingMeRequest" message="tns:pingMeRequest"/>
    <wsdl:output name="pingMeResponse" message="tns:pingMeResponse"/>
    <wsdl:fault name="pingMeFault" message="tns:pingMeFault"/>
</wsdl:operation> 

<wsdl:message name="pingMeFault">
    <wsdl:part name="faultDetail" element="x1:faultDetail"/>
</wsdl:message>
person Hans Schreuder    schedule 17.04.2018
comment
wsdl — это контракт, указанный сервером (который является третьей стороной). Я не изменяю wsdls, это не очень хорошая практика IMO. Причина, по которой я сделал перехватчик, заключалась в попытке получить код ошибки и строку ошибки, отправленную в ответе сервера. - person Carlos; 17.04.2018
comment
Создание WSDL не так сложно, для этого у вас есть редакторы. А почему бы и нет, я полагаю, вы знаете интерфейс. Но посмотрю, смогу ли я найти решение для того, что вы хотите. - person Hans Schreuder; 17.04.2018