簡體   English   中英

SOAP字段始終返回null作為值

[英]SOAP field is always return null as value

我們有SOAP響應,我試圖取消封送處理,或者只是從namesp1:result字段中獲取值,但是我總是獲取空值,而在響應中,該值設置為D。

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <SOAP-ENV:Body>
        <namesp1:CheckTransactionDetailsResponse xmlns:namesp1="http://www.iesnare.com/dra/api/CheckTransactionDetails">
            <namesp1:result xsi:type="xsd:string">D</namesp1:result>
            <namesp1:reason xsi:type="xsd:string"/>
            <namesp1:trackingnumber xsi:type="xsd:string">646498141355</namesp1:trackingnumber>
            <namesp1:endblackbox xsi:type="xsd:string"/>
            <namesp1:details>
                <namesp1:detail>
                    <namesp1:name>device.cookie.enabled</namesp1:name>
                    <namesp1:value>1</namesp1:value>
                </namesp1:detail>
                <namesp1:detail>
                    <namesp1:name>device.flash.enabled</namesp1:name>
                    <namesp1:value>0</namesp1:value>
                </namesp1:detail>
                <namesp1:detail>
                    <namesp1:name>device.flash.installed</namesp1:name>
                    <namesp1:value>0</namesp1:value>
                </namesp1:detail>
                <namesp1:detail>
                    <namesp1:name>device.js.enabled</namesp1:name>
                    <namesp1:value>0</namesp1:value>
                </namesp1:detail>
                <namesp1:detail>
                    <namesp1:name>device.os</namesp1:name>
                    <namesp1:value>UNKNOWN</namesp1:value>
                </namesp1:detail>
                <namesp1:detail>
                    <namesp1:name>ipaddress</namesp1:name>
                    <namesp1:value>127.0.0.1</namesp1:value>
                </namesp1:detail>
                <namesp1:detail>
                    <namesp1:name>realipaddress</namesp1:name>
                    <namesp1:value>127.0.0.1</namesp1:value>
                </namesp1:detail>
                <namesp1:detail>
                    <namesp1:name>realipaddress.source</namesp1:name>
                    <namesp1:value>subscriber</namesp1:value>
                </namesp1:detail>
                <namesp1:detail>
                    <namesp1:name>ruleset.rulesmatched</namesp1:name>
                    <namesp1:value>0</namesp1:value>
                </namesp1:detail>
                <namesp1:detail>
                    <namesp1:name>ruleset.score</namesp1:name>
                    <namesp1:value>0</namesp1:value>
                </namesp1:detail>
            </namesp1:details>
        </namesp1:CheckTransactionDetailsResponse>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

我使用了以下代碼片段:

  1. 通過tagnameNS獲取元素,響應如下:

     Name namesp1:result Value: null 

使用的Java代碼:

    SOAPBody sb = soapResponse.getSOAPBody();
    Document d = sb.extractContentAsDocument();
    NodeList nodeList = d.getElementsByTagNameNS("http://www.iesnare.com/dra/api/CheckTransactionDetails", "result");

    for (int i = 0; i < nodeList.getLength(); i++) {
        org.w3c.dom.Node nodeElement = nodeList.item(i);
        System.out.println("Name " + nodeElement.getNodeName());
        System.out.println("Value: " + nodeElement.getNodeValue());
    }
  1. 對對象采取無情回應,我認為這是最好的方法。 但是然后我得到以下異常。

     Error occurred while sending SOAP Request to Server java.lang.IllegalArgumentException: prefix xsd is not bound to a namespace 

使用的Java代碼:

    SOAPBody sb = soapResponse.getSOAPBody();
    Document d = sb.extractContentAsDocument();
    DOMSource source = new DOMSource(d);
    CheckTransactionDetailsResponse checkTransactionDetailsResponse = (CheckTransactionDetailsResponse) JAXB.unmarshal(source, CheckTransactionDetailsResponse.class);
    System.out.println();
    System.out.println();
    System.out.println("Result: " + checkTransactionDetailsResponse.getResult());
    System.out.println();
    System.out.println();

有人可以幫助我找到獲得響應的正確方法嗎,我更喜歡使用方法2,但是我在互聯網上看到一些東西,這是JAXB中的錯誤。

謝謝

方法1:如果閱讀Node的文檔,您將意識到Node.getNodeValue()對於Element節點將始終返回null (請檢查頁面頂部的表)。

原因是XML元素沒有“值”的概念。 您想要的值(字母D)是該元素的子節點(文本節點)。 您必須遍歷子節點,過濾文本節點,以獲取價值。

方法2:這里的問題來自DOMSource的當前JAXB實現。 保留細節,原因是名稱空間聲明存在於信封級別。 當您剝離主體時,該聲明會在該DOM序列化時丟失。

要使其恢復使用,請在包含您的模式類的程序包的package-info.java中使用@XmlSchema@XmlNs批注的組合。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM