4 服务发布需要注意的地方(包括客户端和服务端)
axis的用法可以说简单,也可以说难。有很多细节方面不注意的话会让你花费很多时间。很多答案在网上是没有答案的,只能靠自己琢磨。在这一节中我就把一些常见的问题或建议总结下:
1.自定义类型的映射。
QName qn = new QName("urn:BeanService", "AbstractServiceinfo");
_call.registerTypeMapping(AbstractServiceinfo.class, qn,
new org.apache.axis.encoding.ser.BeanSerializerFactory(
AbstractServiceinfo.class, qn),
new org.apache.axis.encoding.ser.BeanDeserializerFactory(
AbstractServiceinfo.class, qn));
格式基本如上所示。
一定要记住当你的方法需要传入自定义类型的参数或返回自定义类型时,一定要在wsdd文档中注册,在客户端编程时也要注册。
客户端采取第二种方式时的映射注册可以看3.2.3的代码,采取第一种方式时也要注册,需要找到服务对应的存根类SN_AdvanceSearchSoapBindingStub,在这个类里有各个方法对应的调用配置,找到需要注册的方法,加上上面的映射就行了。格式都是一样的!
2.当返回类型类似于ArrayList<Serviceinfo>时
对于这样的返回类型,axis都会把返回值转成Object[],别想着直接把结果转成ArrayList,有时会出问题
下面是一个典型的用法:方法的返回值是ArrayList<Serviceinfo>,用下面的方法遍历就行了。
Object[] result = (Object[]) call.invoke(new Object[] { search });
if (result != null && result.length > 0) {
for (int i = 0; i < result.length; i++) {
Serviceinfo serviceinfo = (Serviceinfo) result[i];
System.out.println(serviceinfo.getCatagoryName()
+ serviceinfo.getAffiliation());
}
}
对于java中的set也一样,都会转成Object[],如下面的方法:
Map<Integer, Set<Integer>> composition(UserParameter userparameter)得到返回值时就应该这样处理:
Map<Integer, Object[]> result=(Map) call.invoke(new Object[]{userPar});
for (Iterator<Integer> iter = result.keySet().iterator(); iter
.hasNext();) {
Integer key = iter.next();
Object[] obj = result.get(key);
if(obj != null && obj.length > 0) {
for(int i = 0; i < obj.length; i ++) {
Integer serviceinfo = (Integer) obj[i];
System.out.println(serviceinfo);
}
}
注意对应于Set<Integer>的返回值是Object[]类型,通过循环来遍历,如果直接转型就会出现异常。
3.自定义类型一定要可以序列化,也就是要实现java.io.Serializable接口。如果你的方法准备发布成web服务最好把输入和输出都打包成javaBean,axis对javaBean的处理还是很自动的。
4.需要在服务端和客户端传递的javaBean当然在两端的工程里都应该有相似的代码,否则就会出现一方不能解析!如果客户端不能直接拿到javaBean的代码,可以借助wsdl2java生成的类中就应该会有对应的javaBean,直接拿过来用就行,当然,下一步采取哪种方式调用服务都是随意的。可见wsdl2java还是很有用的。
5.这点一定要看:血的教训
如果你的服务中返回值都是类似于List<Serviceinfo> getServiceinfoList(...)这样的集合类型,而没有一个类似于Serviceinfo getServiceinfo(..)这样的方法,发布成服务后,在对应的wsdl中就不会出现Serviceinfo的复杂类型对应的,也就是说你用wsdl2java是不能生成Serviceinfo对应的javaBean的。。调用的时候也就会出错。解决方法是在服务端可以加上一个什么也不做的public方法,如:
public Serviceinfo doNothing(){
Serviceinfo info=new Serviceinfo();
return info;
}
这样。wsdl文档中就会有对Serviceinfo的类型定义了。
这一步很重要啊。。当时在这徘徊了好久。。一定不要以为你在wsdd中有了beanMapping定义,就会在wsdl中出现对应类型定义,一定要在你的public方法的输入或返回值用到这个bean时才会在wsdl中定义!
还碰到好多问题,一时想不起来,想到后再补充吧。
最后看看一些参考文献:
1.Web_Service开发指南_2.3.1.pdf,新手建议先看这个。。比我写的好多了!可以到这个网下:
http://www.hlmz.org/forum/
2.axis 生成客户端client stub文件
http://hi.baidu.com/shanshuijoy/blog/item/6766673e4d2a1e3570cf6cf9.html
3.AXIS实现Web服务深入篇
http://g.51cto.com/michael/323
4.axis开发web服务
http://yangzb.iteye.com/blog/256890
分享到:
相关推荐
axis1.4完整包下载Apache Axis是一种SOAP(简单对象访问协议”)实现。 包含 Axis1.4的所有完整包。
axis1.4生成客户端 根据WSDL生成客户端和服务端
axis1.4和axis2相关jar文件,axis1.4和axis2相关jar文件
springboot 集成axis1.4的webservice,该为maven的工程
Axis1.4如何实现头部鉴权(包括实现类模板)
内有axis1.4jar包以及使用eclipse和axis1.4 将WSDL和服务端代码互转方法 亲测可用
axis1.4生成访问客户端代码
Axis1.4从服务端到客户端图文攻略,同时附赠Axis1.4 Jar包。 本攻略经过多次测试可靠耐用,并同时带有详细的文字说明,保证一学就会!从现在起axis不再是问题!让你爱上web service!
axis1.4的帮助文档,WEBService发布必备产品。
用于axis1.4开发webService。 文件包含,axis1.4.ZIP以及其他所需jar包,和生成webservice客户端,生成webService服务端发布 的详细教程说明。
Axis1.4开发指南.pdf axis-bin-1_4.zip axis相关文档 axis1.4 开发jar包
Axis1.4开发指南 介绍Axis1.4的开发方式,并附上不少范例代码
axis1.4 webservice个人学习笔记
java org.apache.axis.wsdl.WSDL2Java -u http://xxxxxx?wsdl -p com.webservice.wsdl -t -u 要访问的webservice的地址标准的wsdl文件 -p 生成java文件的包名 -t 生成的java文件中包含junit的测试代码。 详见...
axis1.4学习示例(详细步骤说明)axis1.4
webservice axis1.4服务搭建
里面包含axis1.4使用到的jar包以及详细的使用方法和实例
本方法是用axis1.4技术,实现java客户端调用webservice。已经可实现过可行的,如果不行可加我QQ号302633进行详细解析。
使用spring3+ cxf 3.4做服务方,Axis1.4做请求方,在调用的时候,通过转换cxf的wsdl格式为axis1.4的wsdl格式来达到调用的目的。