【问题标题】:How can I get Axis2 to handle an array?如何让 Axis2 处理数组?
【发布时间】:2012-07-18 15:48:17
【问题描述】:

我正在从 PHP NuSoap 实现中检索数据,它返回的数据如下:

<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/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/">

<SOAP-ENV:Body>

<ns1:getHashCodeAllTablesResponse xmlns:ns1="urn:getSchemaForRhythms">

<return xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType=":[121]">

<item xsi:type="xsd:">

<md5Hash xsi:type="xsd:string">e294967afe9834bf8477252ac0c3686e</md5Hash>

<tableName xsi:type="xsd:string">SYSCONGLOMERATES</tableName>

<isView xsi:type="xsd:string">false</isView>

<viewDefinition xsi:type="xsd:string">null</viewDefinition>

</item>

我认为这是问题所在:&lt;return xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType=":[121]"&gt;

当我将我的 Axis2 soap 客户端指向服务时,我收到了这个错误:

org.apache.axis2.AxisFault: org.apache.axis2.databinding.ADBException: Unsupported type http://schemas.xmlsoap.org/soap/encoding/ Array

这是我正在尝试做的一个非常简单的 java 示例:

public static void main(String[] args) {
    // TODO code application logic here
    try{
        GetSchemaForRhythmsStub stub = new GetSchemaForRhythmsStub(null,"http://test.test.com/sqlSchemaService/schemaBuilder.php" );
        GetSchemaForRhythmsStub.GetHashCodeAllTablesE response2= new GetSchemaForRhythmsStub.GetHashCodeAllTablesE();
        stub.getHashCodeAllTables(response2);
    }catch(Exception ex)
    {
       System.out.println(ex.toString());

    }
}

我找不到任何与 Array 数据类型和 Axis 相关的文档。我错过了什么吗?

谢谢,

【问题讨论】:

    标签: java xml soap nusoap


    【解决方案1】:

    您缺少的是 SOAP Encoding Array 类型非常老派(即在 XML Schema 出现之前他们曾经使用过的类型),而 Axis2 不喜欢它。您可以尝试将数据绑定从 ADB(默认)切换到 XMLBeans。您如何执行此操作取决于您如何解析 WSDL。以下是我找到的一些参考资料:

    SOAP encoding and Axis2

    Axis2's wsdl2java fails on RPC/Encoded style web services

    通常,查找“soap 编码数组axis2”以查找有关您正在做什么的信息。

    【讨论】:

    • 谢谢,我会检查这些链接。此时将我的 nusoap 更改为不使用数组会更简单吗?我希望避免这种情况,因为 PHP 是我较弱的语言,但如果它处理得不好,我不想让它继续存在。
    • PHP 也不是我的第一语言,但我可能会花时间研究如何让 NuSOAP 吐出更好的 WSDL,特别是如果这不是唯一使用该服务的客户端。
    • 感谢您的文章,我最终重写了 nuSoap 客户端以输出常规 XML 而不是数组。现在让 Axis2 工作。
    【解决方案2】:

    我遇到了同样的问题,生成的代码在表示数组的 XMLBean 上没有设置方法。为了解决这个问题,我直接在生成的类上使用了 XMLBean API。

    以下代码 sn-p 演示了向生成的数组类添加元素。就我而言,我必须返回一个包含两个值的字符串数组。

        ArrayOfXsdString strArray = syncResponse.addNewProcessSyncReturn();
    
                 /* set the size of the array */
        strArray.setArrayType("soapenc:string[2]");
    
                /* get the XMLCursor object and go to the end of the XML represented by this bean */   
        XmlCursor cur = strArray.newCursor();
        cur.toEndToken();
    
                /* processSyncReturn is the XML element name of the array */        
        cur.toChild("processSyncReturn");
        cur.insertElementWithText("processSyncReturn","this is array element 1");
        cur.insertElementWithText("processSyncReturn","this is array element 2");
    

    在响应 SOAP 消息中生成以下内容

    <processSyncReturn soapenc:arrayType="soapenc:string[2]">
    <processSyncReturn>this is array element 1</processSyncReturn>
    <processSyncReturn>this is array element 2</processSyncReturn>
    </processSyncReturn>
    

    侯赛因

    http://nsinfra.blogspot.in

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-16
      • 2012-09-14
      • 2020-11-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多