转换不成功
你生成的wsdd-server.xml文件可能不对。

解决方案 »

  1.   

    wsdd-server.xml文件?我用的是tomcat+axis,里面没有找到这个文件,这个文件是自动生成的吗?
      

  2.   

    终于可以解决返回类型为数组为空的问题了,原来是在server-config.wsdd中需要添加<arrayMapping...>的元素,现在整理如下:
    1。axis下的配置文件:server-config.wsdd:
     <service name="ProcessCDW" provider="java:RPC">
      <parameter name="allowedMethods" value="*" regenerateElement="false"/>
      <parameter name="className" value="com.caca.WS.service.ProcessCDW" regenerateElement="false"/>
      <beanMapping languageSpecificType="java:com.caca.WS.type.Product" qname="ns:Product" xmlns:ns="urn:ProductService"/>
      <arrayMapping  type="java:com.caca.WS.type.Product[]" xmlns:ns="urn:ProductService" qname="ns:ArrayOfProduct"
        innerType="cmp-ns:Product" xmlns:cmp-ns="urn:ProductService" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
      <typeMapping xmlns:ns="urn:ProductService" qname="ns:Product" type="java:com.caca.WS.type.Product" serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
    deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
    encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
    </service>2。服务器端文件:
    public  Product[] arrayProduct = null;
    public Product[] getProductArray(String prod_id)throws IOException,SQLException{
        ArrayList products= new ArrayList();
        int sizeOfProducts=0;
        Context ctx = null;
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try{
            ctx = new InitialContext();
            if(ctx == null )
                throw new Exception("Boom - No Context");
            DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/MSSQL");
            if (ds != null) {
                con = ds.getConnection();
                con.setAutoCommit(false);
                stmt = con.prepareStatement("select prod_id,comp_sku,comp_part_name,price from pp_cdw where prod_id<?");
                stmt.setString(1,prod_id);
                rs = stmt.executeQuery();
                while(rs.next()){
                    Product product= new Product();
                    product.setProd_id(new String(rs.getString(1)).trim());
                    product.setComp_sku(new String(rs.getString(2)).trim());
                    product.setComp_part_name(new String(rs.getString(3)).trim());
                    product.setPrice(rs.getFloat(4));
                    products.add(product);
                }
            }
            Iterator iter=products.iterator();
            while(iter.hasNext()){
                arrayProduct=new Product[products.size()];
       System.out.println(arrayProduct.length);
       for(int i=0;i<products.size();i++){
                    arrayProduct[i]=(Product)iter.next();
                }
            }
        }catch(SQLException e){
            e.printStackTrace();
            throw e;
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            try{
                if(rs!=null)
                rs.close();
                if(stmt!=null)
                    stmt.close();
                if(con!=null)
                    con.close();
                if(ctx!=null)
                    ctx.close();
            }catch(Exception e){
                e.printStackTrace();
            }
        }
        return arrayProduct;
    }
    3。客户端:
    public static void main(String[] args) throws Exception{
        try {
            String endpoint ="http://192.1.1.117:8080/ProductSpider/services/ProcessCDW";
            Service  services = new Service();
            Call     call    = (Call) services.createCall();
            call.setTargetEndpointAddress( new java.net.URL(endpoint) );
            //注册SimpleObject的序列化类型
            QName qn1 = new QName("urn:ProductService","ArrayOfProduct");
            call.registerTypeMapping(Product[].class, qn1,
                new BeanSerializerFactory(Product[].class, qn1),
                new BeanDeserializerFactory(Product[].class, qn1));
            QName qn2 = new QName("urn:ProductService","Product");
            call.registerTypeMapping(Product.class, qn2,
                new BeanSerializerFactory(Product.class, qn2),
                new BeanDeserializerFactory(Product.class, qn2));
            Product[] products = (Product[])call.invoke("getProductArray", new Object[]{"24294"} );
            int size = products==null?0:products.length;
            System.out.println("size of products' Array:"+size);
            for(int i=0;i<size;i++){
                Product product=(Product) products[i];
                System.out.println("\nProduct Informatioin:");
                System.out.println("\tprod_id:"+product.getProd_id());
                System.out.println("\tcomp_sku:"+product.getComp_sku());
                System.out.println("\tcomp_part_name:"+product.getComp_part_name());
                System.out.println("\tprice:"+product.getPrice());
            }
        } catch (Exception e) {
            System.err.println(e.toString());
        }
    }
      

  3.   

    我现在刚开始看webService可以留个msn吗?有好多问题请教大家。
    我的是:[email protected]
      

  4.   

    ArrayList中的所有元素都不会自动系列化到介质中。仅是对这些元素的一个引用,并不是真正的对象,序列化一个对象的引用是毫无意义的,因为序列化是为了反序列化,当你反序列化时,这些对象的引用已经不可能指向原来的对象了。
      

  5.   

    最好用WSDL协议的基准类型,如果你用特殊类型必须实现序列化和反序列化