首先我 写了一个操作数据库(我用的是mysql)的java类,里面有一些方法是直接返回一个结果集vector(比如:select * from goods_list),接着我使用axis 的java2wsdl将这个java类生成wsdl文件,然后用一个测试类根据wsdl文件来引用websevice,调用其中的返回结果集的方法,这时候问题就来了,数据库可以连接,但是就是不能返回结果集,取不到数据??我不知道为什么,请各位高手支支招!!!最好能以实例说明

解决方案 »

  1.   

    用wsdl生成axis的客户端,然后再调用webservice服务,看一下能不能返回结果。
    如果不行,尝试将Vector修改为数组。
      

  2.   

    因为你结果集是个List或者数组或者其他容器,axis2里面返回容器类或者数组的时候要将其封装成OMElement(XML格式)才能传递,你参考下下面的传递list的例子:package aixs2listtest;import java.util.*;
    public class HelloBean {
        private String name;
        private int id;
        private List<HelloBeanClass> helloBeanClasses;
        public HelloBean(){}
        public HelloBean(String name, int id ,List<HelloBeanClass> helloBeanClass){
            this.name=name;
            this.id=id;
            this.helloBeanClasses=helloBeanClass;
        }
        public void setName(String name){
            this.name=name;
        }
        public String getName(){
            return this.name;
        }
        public void setId(int id){
            this.id=id;
        }
        public int getId(){
            return this.id;
        }
        public List<HelloBeanClass> getHelloBeanClass(){
            return this.helloBeanClasses;
        }
        public void setHelloBeanClass(List<HelloBeanClass> helloBeanClass){
            this.helloBeanClasses=helloBeanClass;
        }}package aixs2listtest;public class HelloBeanClass {
        private int id;
        private String className;
        
        public HelloBeanClass(){}
        public HelloBeanClass(int id, String className){
            this.id=id;
            this.className=className;
        }
        public void setId(int id){
            this.id=id;
        }
        public int getId(){
            return this.id;
        }
        
        public void setClassName(String className){
            this.className=className;
        }
        public String getClassName(){
            return this.className;
        }}
    Java code
    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(){
            HelloBeanClass hbc1=new HelloBeanClass(11,"moonlight1");
            HelloBeanClass hbc2=new HelloBeanClass(22,"moonlight2");
            HelloBeanClass hbc3=new HelloBeanClass(33,"moonlight3");
            List<HelloBeanClass> clss=new ArrayList<HelloBeanClass>();
            clss.add(hbc1);clss.add(hbc2);clss.add(hbc3);
            HelloBean  hbs=new HelloBean("moon",1,clss);
            HelloBean  hbs2=new HelloBean("mo"+"\non2",2,clss);
            HelloBean  hbs3=new HelloBean("moon3",3,clss);
             List<HelloBean> list = new ArrayList<HelloBean>();
              list.add(hbs);
              list.add(hbs2);
              list.add(hbs3);
              OMElement omElement = BeanUtil.getOMElement(new QName("HelloBeans"), list.toArray(), new QName("HelloBean"), false, null);        return omElement;
        }
        public static void main(String [] args){
            HelloSource h=new HelloSource();
            System.out.println("asd"+"\n"+"sdf");
            h.echo();
        }}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);            OMElement result = sender.sendReceive(getPricePayload);
                System.err.println(getResults(result));        } catch (Exception e) {
                e.printStackTrace();
            }
        }
        private static List<HelloBean> getResults(OMElement element) throws AxisFault {
              if (element == null) {
               return null;
              }
              Iterator iterator = element.getChildElements();
              List<HelloBean> 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")) {
                    HelloBean person = (HelloBean) BeanUtil.processObject(omElement,
                            HelloBean.class, null, true,
                   new DefaultObjectSupplier());
                 list.add(person);
                }
               }
              }
              return list;
             }
        
    }
    services.xml XML code<service name="HelloSource" scope="application">
        <description>
            HelloSource
        </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>以上文件编译后打成aar包的内容如下: HelloSource/aixs2listtest/*.java 
              /META-INF/services.xml 
      

  3.   

    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);             OMElement result = sender.sendReceive(getPricePayload); 
                System.err.println(getResults(result));         } catch (Exception e) { 
                e.printStackTrace(); 
            } 
        } 
    上面的result 就是从服务器端获得的xml格式的数据(也就是你要传输的对象) 
    System.err.println(getResults(result)); 
    这个你可以改成List <HelloBean> list=getResults(result); 
    这样,对象就保存到了list里面
      

  4.   

    webservice是通过网络进行序列化传递数据,而你的结果集是通过容器来存储的,是不能正常被序列化的。也就是说你的webservice不能将结果集中的容器正常转化成二进制数据,客户端调用webservice的时候也就不能正常接收和解释这部分二进制数据了。
      

  5.   

     使用axis自带的序列化和反序列画化类,就可以了。不过我在想简单值对象需要这样做。那么Vector需要这样么?
      

  6.   

    普通JavaBean(简单值对象)的序列化和反序列化
    首先,在web service部署端,修改server- config.wsdd文件,在具体的service配置,增加如下代码:
    < beanMapping languageSpecificType= "java:com.hnisi.axis.Book" qname= "ns1:Book" 
             xmlns: ns1= "urn:BeanService" / > 
    languageSpecificType属性指定JavaBean类文件位置,qname属性指定JavaBean类的名字。当然,一个service可以绑定多个bean对象。
    *************
    QName qn = new QName("urn:BeanService" ,"Book" ); 
    call.registerTypeMapping(Book.class , qn,
    new BeanSerializerFactory(Book.class , qn),
                        new BeanDeserializerFactory(Book.class , qn));
    这个事一个简单类的反序列和序列化相关配置。其中BeanSerializerFactory就是axis自带的。我也这几天在学,我刚学会了简单值对象的传递。你的那个数组应该是不需要序列化的。 你邮箱给我。,我给你发一份资料。你看着尝试一下。
      

  7.   

    我已经做了验证了 。使用Vector不需要手动序列化。axis已经给你做好了。我用的是AXIS 1.1 OM那个是2.0里面的吧。我调用服务器端的方法。该方法返回一个Vector类型。可以取到值。你需要的话 我可以给你我的源代码。学习自己做的
      

  8.   

    已经发了,不好意思,前几天没空上CSDN
      

  9.   

    可以给我一份吗?[email protected] 谢谢
      

  10.   

    能传一份给我吗?我也正在学习中  [email protected]      
    3Q了哦