2014-05-06 4 views
1

Я звоню в веб-сервис SOAP с использованием JAX WS. В случае ошибки я получаю следующий ответ от клиента (я вижу это в моем журнале трассировки):SOAPFaultException detail is null

<?xml version="1.0"?> 
<SOAP-ENV:Envelope xmlns:SOAP- ENV="http://schemas.xmlsoap.org/soap/envelope/"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<SOAP-ENV:Body> 
    <SOAP-ENV:Fault> 
     <faultcode>Error</faultcode> 
     <faultstring>Error</faultstring> 
     <SOAP-ENV:detail> 
      <BLAServiceFault xmlns:ns="http://messages.testservice.com/TestService/2012/10"> 
       <ns:ReturnStatus> 
        <ns:ReturnCode>-97</ns:ReturnCode> 
        <ns:ReturnStatusSpecification> 
         <ns:SubCode xsi:nil="true"/> 
         <ns:Description>The price of productA must be higher than 30.</ns:Description> 
        </ns:ReturnStatusSpecification> 
       </ns:ReturnStatus> 
      </BLAServiceFault> 
     </SOAP-ENV:detail> 
    </SOAP-ENV:Fault> 
</SOAP-ENV:Body> 

Как вы можете видеть, полезная ошибка в узле детали:

<SOAP-ENV:Envelope> 
<SOAP-ENV:Body> 
    <SOAP-ENV:Fault> 
     <SOAP-ENV:detail> 

В моем клиенте я получаю исключение SOAPFaultException, у которого есть объект SOAPFault. Кажется, что объект SOAPFault пропускает узел, который я разместил выше. SOAPFaultException.getFault(). GetDetail() имеет значение null. Исключением является javax.xml.ws.soap.SOAPFaultException: ошибка. Как я могу получить подробный узел с описанием?

Спасибо.

ответ

0

Похоже, что сообщение, отправленное службой, не соответствует требованиям SOAP 1.1. После того как они удалили префикс «SOAP-ENV» с узла «detail», он отлично работает.

0

Посмотрите на вопрос. Possible to consume badly formed Fault Messages?

} catch (SoapFaultClientException e) { 
    log.error(e); 
    SoapFaultDetail soapFaultDetail = e.getSoapFault().getFaultDetail(); 
    SoapFaultDetailElement detailElementChild = (SoapFaultDetailElement) soapFaultDetail.getDetailEntries().next(); 
    Source detailSource = detailElementChild.getSource(); 

    try { 
     Object detail = (JAXBElement<SearchResponse>) getWebServiceTemplate().getUnmarshaller().unmarshal(detailSource); 
//    throw new SoapFaultWithDetailException(detail); 

    } catch (IOException e1) { 
     throw new IllegalArgumentException("cannot unmarshal SOAP fault detail object: " + soapFaultDetail.getSource()); 
    } 

}