我想把数据库取到得数据传到客户端去。soap中消息格式应该怎么定义好点?
我把它定义成:<record>
             <name>Tim</name><age>18</age>
            <record>
            <record>
             <name>Jan</name><age>20</age>
            <record>但是客户端读取record只能读取到最后的那条记录。
请问这个该怎么操作好?数据量不大,一次就传输个几十条吧。

解决方案 »

  1.   


    先定义个Record类, 里面有name 和 age属性按照数组的形式传递就可以了吧
      

  2.   

    我目前正在学习Axis1 1.4所以我只能提供这方面的例子
    在我的例子中 Request和Response都是数组, 我的WSDL 的配置如下, 希望对你有用<?xml version="1.0" encoding="UTF-8"?>
    <wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime"
    xmlns:tns="urn:ttdev.com:ss"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="BizService"
    targetNamespace="urn:ttdev.com:ss">
    <wsdl:types>
    <xsd:schema targetNamespace="urn:ttdev.com:ss" xmlns:tns="urn:ttdev.com:ss">
    <xsd:complexType name="productQuery">
    <xsd:sequence>             
                <xsd:element name="productId" type="xsd:string"></xsd:element>
                <xsd:element name="qty" type="xsd:int"></xsd:element>             
                </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="productQueryResult">
    <xsd:sequence>             
                <xsd:element name="productId" type="xsd:string"></xsd:element>
                <xsd:element name="price" type="xsd:int"></xsd:element>             
                </xsd:sequence>
    </xsd:complexType>
    <xsd:element name="productQuery">
    <xsd:complexType>
                 <xsd:sequence>
                 <xsd:element name="productQuery" minOccurs="0" maxOccurs="unbounded" type="tns:productQuery"></xsd:element>
                 </xsd:sequence>
                 </xsd:complexType>
    </xsd:element>
    <xsd:element name="productQueryResult">
    <xsd:complexType>
                 <xsd:sequence>
                 <xsd:element name="productQueryResult" minOccurs="0" maxOccurs="unbounded" type="tns:productQueryResult"></xsd:element>
                 </xsd:sequence>
                 </xsd:complexType>
    </xsd:element>   
    <xsd:element name="invalidQuery">
    <xsd:complexType>
    <xsd:choice>
    <xsd:element name="invalidProductId" type="xsd:string"></xsd:element>
    <xsd:element name="invalidQty" type="xsd:int"></xsd:element>
    </xsd:choice>
    </xsd:complexType>
    </xsd:element>
                
            </xsd:schema>
    </wsdl:types>
    <wsdl:message name="queryRequest">
    <wsdl:part element="tns:productQuery" name="queryRequest" />
    </wsdl:message>
    <wsdl:message name="queryResponse">
    <wsdl:part element="tns:productQueryResult" name="queryResponse" />
    </wsdl:message>
    <wsdl:message name="queryInvalidQuery">
    <wsdl:part name="queryInvalidQuery" element="tns:invalidQuery"></wsdl:part>
    </wsdl:message>
    <wsdl:portType name="BizService">
    <wsdl:operation name="query">
    <wsdl:input message="tns:queryRequest" />
    <wsdl:output message="tns:queryResponse" />
    <wsdl:fault name="invalidQuery" message="tns:queryInvalidQuery"></wsdl:fault>
    </wsdl:operation>
    </wsdl:portType>
    <wsdl:binding name="BizServiceSOAP" type="tns:BizService">
    <soap:binding style="document"
    transport="http://schemas.xmlsoap.org/soap/http" />
    <wsdl:operation name="query">
    <soap:operation
    soapAction="http://ttdev.com/BizService/query" />
    <wsdl:input>
    <soap:body parts="queryRequest" use="literal" />
    </wsdl:input>
    <wsdl:output>
    <soap:body parts="queryResponse" use="literal" />
    </wsdl:output>
    <wsdl:fault name="invalidQuery">
    <soap:fault name="invalidQuery" use="literal"/>
    </wsdl:fault>
    </wsdl:operation>
    </wsdl:binding>
    <wsdl:service name="BizService">
    <wsdl:port binding="tns:BizServiceSOAP"
    name="BizServiceSOAP">
    <soap:address location="http://ttdev.com/ss" />
    </wsdl:port>
    </wsdl:service>
    </wsdl:definitions>
      

  3.   

    发布一个webservice方法,方法的返回值是一个复杂类型的数组,这个复杂类型对应数据库的一条记录。方法里面需要实现:从数据库里将数据查询出来,存放到相应的复杂对象数组里就ok了。
      

  4.   

    我理解为把需要传递的数据放到一个类对象里面,然后序列化传递,是否是这样。这样的话还需要像4L一样配置WSDD吗?
      

  5.   

    我理解为把需要传递的数据放到一个类对象里面,然后序列化传递,是否是这样。这样的话还需要像4L一样配置WSDD吗?
      

  6.   

    record类:package aixs2listtest;
    public Record{
    private String name;
    private int id;
    /**
    set和get方法省略
    */
    }写个类如下:package aixs2listtest;
    import java.util.*;import org.apache.axiom.om.OMNode;
    import org.apache.axiom.om.OMElement;
    import org.apache.axis2.util.StreamWrapper;
    import org.apache.axiom.om.impl.builder.StAXOMBuilder;
    import org.apache.axiom.om.impl.llom.factory.OMXMLBuilderFactory;
    import org.apache.axiom.om.OMAbstractFactory;
    import org.apache.axis2.databinding.utils.BeanUtil;
    import javax.xml.namespace.QName;
    public class HelloSource {
    public OMElement  echo(){
                  /××下面把你想要传的数据封装成record类*/
    Record hbs=new Record("moon",1);
    Record hbs2=new Record("mo",2);
    Record hbs3=new Record("moon3",3);
     List<Record > list = new ArrayList<Record >();
          list.add(hbs);
          list.add(hbs2);
          list.add(hbs3);
          OMElement omElement = BeanUtil.getOMElement(new QName("Records"), list.toArray(), new QName("Record"), false, null); return omElement;
    }
    }
    写个services.xml文件如下:
    <service name="Record" scope="application">
        <description>
            PassRecord
        </description>
        <messageReceivers>
            <messageReceiver 
                mep="http://www.w3.org/2004/08/wsdl/in-only"
        class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>
            <messageReceiver
                mep="http://www.w3.org/2004/08/wsdl/in-out"
        class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
        </messageReceivers>
        <parameter name="ServiceClass">
            aixs2listtest.HelloSource 
        </parameter>
    </service>把上面的JAVA文件编译后打成一个具有如下文件的aar包(可以直接压缩,然后改扩展名):aixs2listtest/Record.class
                 /HelloSource.class
    META-INF/services.xml
    把这个aar包放到axis2下面,客户端可以通过如下代码调用获取你传来的信息:package aixs2listtest;
    import java.util.*;
    import org.apache.axiom.om.OMAbstractFactory;
    import org.apache.axiom.om.OMElement;
    import org.apache.axiom.om.OMFactory;
    import org.apache.axiom.om.OMNamespace;
    import org.apache.axiom.om.OMNode;
    import org.apache.axis2.AxisFault;
    import org.apache.axis2.Constants;
    import org.apache.axis2.addressing.EndpointReference;
    import org.apache.axis2.client.Options;
    import org.apache.axis2.client.ServiceClient;
    import org.apache.axis2.databinding.utils.BeanUtil;
    import org.apache.axis2.engine.DefaultObjectSupplier;public class StubTest {    private static EndpointReference targetEPR = 
            new EndpointReference("http://localhost:8080/axis2/services/HelloSource");    public static OMElement getPricePayload() {
            OMFactory fac = OMAbstractFactory.getOMFactory();
            OMNamespace omNs = fac.createOMNamespace("http://hello/xsd", "tns");        OMElement method = fac.createOMElement("echo", omNs);
            return method;
        }
        public static void main(String[] args) {
            try {
                OMElement getPricePayload = getPricePayload();
              
                Options options = new Options();
                options.setTo(targetEPR);
                options.setTransportInProtocol(Constants.TRANSPORT_HTTP);            ServiceClient sender = new ServiceClient();
                sender.setOptions(options);
                //这个 result就是你想要的如下xml
                  //<record> 
                //<name>Tim </name> <age>18 </age> 
                //<record> 
                //<record> 
                //<name>Jan </name> <age>20 </age> 
                //<record>             OMElement result = sender.sendReceive(getPricePayload);
               //这个List就保存了你传过来的record对象
                List<Record> list=getResults(result);        } catch (Exception e) {
                e.printStackTrace();
            }
        }
        private static List<Record> getResults(OMElement element) throws AxisFault {
           if (element == null) {
            return null;
           }
           Iterator iterator = element.getChildElements();
           List<Record> list = new ArrayList<HelloBean>();
           while (iterator.hasNext()) {
            OMNode omNode = (OMNode) iterator.next();
            if (omNode.getType() == OMNode.ELEMENT_NODE) {
             OMElement omElement = (OMElement) omNode;
             if (omElement.getLocalName().toLowerCase().equals("return")) {
              Record person = (Record) BeanUtil.processObject(omElement,
              Record.class, null, true,
                new DefaultObjectSupplier());
              list.add(person);
             }
            }
           }
           return list;
          }
        
    }至于wsdl文件,打开http://localhost:8080/axis2/HelloSource?wsdl可以看到axis2帮你自动生成了。
      

  7.   

    楼上的,跟到你博客看了。
    http://blog.csdn.net/rommal7090/archive/2009/04/08/4057771.aspx