2

Java Web サービスを呼び出す Soap Fault がある場合、この種の応答があります。

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body>
        <soap:Fault>
            <faultcode>soap:Server</faultcode>
            <faultstring>Fault occurred while processing.</faultstring>
            <detail>
                <ns1:WaybillRegistrationFault xmlns:ns1="http://pod.waybillmanagement.ws.industrysystem.com.ar/">
                    <errors xmlns:ns2="http://pod.waybillmanagement.ws.industrysystem.com.ar/">
                        <code>80000</code>
                        <description>El número de CTG 20140904 ya existe</description>
                    </errors>
                    <errors xmlns:ns2="http://pod.waybillmanagement.ws.industrysystem.com.ar/">
                        <code>1000</code>
                        <description>La carta de porte ya se encuentra registrada.</description>
                    </errors>
                </ns1:WaybillRegistrationFault>
            </detail>
        </soap:Fault>
    </soap:Body>
</soap:Envelope>

次のように、handleFault メソッドを使用して Soap Handler を作成しました。 public boolean handleFault(SOAPMessageContext context) {

    try {
        System.err.println("Handler handleFault");

        if (context.getMessage().getSOAPBody().hasFault()) {
            SOAPFault fa = context.getMessage().getSOAPBody().getFault();
            System.err.println(fa.getFaultString());
            System.err.println("FaultCode: " + fa.getFaultCode() + " - Detail: " + fa.getDetail());
        }
        return true;
    } catch (SOAPException ex) {
        System.err.println("SoapEx " + ex.getMessage());
        return true;
    }
}

しかし、私の出力では、私が持っているのは次のとおりです:

Handler handleFault
Fault occurred while processing.
FaultCode: soap:Server - Detail: [detail: null]

エラーノードを処理するにはどうすればよいですか?

アップデート:

fa.getDetail().getFirstChild().getTextContent()xml内のテキストを取得します。どうすればそれをオブジェクトとして取得できますか。WaybillRegistrationFault だと思います。

4

2 に答える 2

0

障害内容を xml string として出力したい場合は、 fa.getDetail() によって返された dom インスタンスを String に変換する必要があります。 fa.getDetail().toString() return ["+getNodeName()+": "+ getNodeValue()+"]" xml のコンテンツではありません。

以下を試してください。

String detailStr=dom2string(fa.getDetail())
System.err.println("FaultCode: " + fa.getFaultCode() + " - Detail: " + detailStr); 


public static final String dom2string(Node node) {
    try {
        if (node == null) {
            return null;
        }

        Transformer tf = transformerThreadLocal.get();
        // Create writer
        StringWriter sw = new StringWriter(buffer, Integer.MAX_VALUE);
        StreamResult result = new StreamResult(sw);

        // transform
        tf.transform(new DOMSource(node), result);

        return sw.getBuffer();
    } catch (Exception e) {
        throw new RuntimeException("Could not convert Node to string", e);
    }
}
于 2014-09-10T22:28:27.407 に答える