SOAP字段始终返回null作为值

时间:2016-11-02 15:27:55

标签: java soap

我们有SOAP响应,我正在尝试解组这个或只是从namesp1:result字段获取值,但我总是得到值null,而在响应中,值设置为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. 按标记名称获取元素,响应如下:

    Name namesp1:result
    Value: null
    
  2. 使用过的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
      
    2. 使用过的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 个答案:

答案 0 :(得分:1)

方法1: 如果您阅读Node的文档,您会发现Node.getNodeValue()将始终返回nullElement个节点(请查看页面顶部的表格)。

原因是没有&#34;值&#34; XML元素的概念;您想要的值(字母D)是该元素的子节点(文本节点)。您必须遍历子节点,过滤文本节点才能获得您的价值。

方法2: 这里的问题来自DOMSource的当前JAXB实现。保留细节,原因是名称空间声明出现在信封级别;剥离正文时,该声明在该DOM的序列化中丢失。

要让它重新使用包含架构类的包的package-info.java中的@XmlSchema@XmlNs注释的组合。