5

我正在使用 JAX WS 2.0 调用 SOAP Web 服务。如果出现错误,我会收到以下响应:

<?xml version="1.0"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://www.w3.org/2003/05/soap-   envelope">
    <soap:Header/>
    <soap:Body>
        <soap:Fault  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://www.w3.org/2003/05/soap- envelope" xmlns:xml="http://www.w3.org/XML/1998/namespace">
            <soap:Code>  
                <soap:Value>soap:Receiver</soap:Value>
            </soap:Code>
            <soap:Reason>
                <soap:Text  xml:lang="en">Exception of type 'blah blah' was thrown.
                </soap:Text>
            </soap:Reason>
            <soap:Node>{SOME URL}</soap:Node>
            <detail>
                <error>345</error>
                <message>Cannot find user. Blah  blah</message>
            </detail>
        </soap:Fault>
    </soap:Body>
</soap:Envelope>

如您所见,有用的错误在详细节点中:

<soap:Envelope>  
    <soap:Body>  
        <soap:Fault>  
            <detail>

在我的客户端中,我得到一个具有 SOAPFault 对象的 SOAPFaultException。SOAPFault 对象似乎缺少我在上面发布的节点。SOAPFaultException.getFault().getDetail() 为空。但是,它具有包括soap:Reason 在内的所有其他节点。知道为什么它缺少详细节点吗?

谢谢。

4

2 回答 2

3

事实证明,detail 节点也需要包含 SOAP 名称空间。所以它需要是:

<soap:detail>

由于我无法控制 Web 服务,因此我设法在注入客户端的自定义 SOAPHandler 的 handleFault 方法中进行了此更改。更改后,故障的详细信息不再为空,并且具有所有子节点。

基于http://www.w3.org/TR/soap12-part1/#soapfault,我相信开发人员需要在故障期间更正响应。

于 2012-12-18T05:25:07.077 回答
0

这对我有用:

} 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());
    }

}
于 2015-09-15T14:43:37.517 回答