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() が null です。ただし、soap:Reason を含む他のすべてのノードがあります。詳細ノードが欠落している理由は何ですか?

ありがとう。

4

2 に答える 2

3

詳細ノードにも SOAP 名前空間を含める必要があることがわかりました。したがって、次のようにする必要があります。

<soap:detail>

私は Web サービスを制御できないため、クライアントに注入したカスタム SOAPHandler の handleFault メソッドでこの変更を行うことができました。その変更後、障害の詳細は null ではなくなり、すべてのサブノードが表示されます。

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 に答える