Web Service返回类型ArrayList,客户端调用时为空,为什么? 转换不成功你生成的wsdd-server.xml文件可能不对。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 wsdd-server.xml文件?我用的是tomcat+axis,里面没有找到这个文件,这个文件是自动生成的吗? 终于可以解决返回类型为数组为空的问题了,原来是在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()); }} 我现在刚开始看webService可以留个msn吗?有好多问题请教大家。我的是:[email protected] ArrayList中的所有元素都不会自动系列化到介质中。仅是对这些元素的一个引用,并不是真正的对象,序列化一个对象的引用是毫无意义的,因为序列化是为了反序列化,当你反序列化时,这些对象的引用已经不可能指向原来的对象了。 最好用WSDL协议的基准类型,如果你用特殊类型必须实现序列化和反序列化 Java中调用有返回值的存储过程 Ajax代码从Servlet部署到Struts就报错? java写个一个程序出现运行问题!望高手赐教! spring+hibernate 如何这样事务管理 关于在JBOSS下部署EJB的问题??? 高手请教 weblogic 8.1 装好后运行jsp?我访问http://127.0.0.1:7001怎么访问不了呢? JNDI取不到连接,如何解决?在线等 在jsp中无法调用import org.jdom.*,有一简单源程序,请各位大虾指教! 关于Struts的一个简单问题!!在线等待 请教一个通信的问题 >>>>因为没有项目经验而找不到工作怎么办?
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());
}
}
我的是:[email protected]