注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

让一切都逝去吧

排骨炖泥菜/猪肝炒苹果/鱼籽狗肉汤/狗头薏米汤

 
 
 

日志

 
 

java调用.net的web service服务  

2013-04-17 23:39:12|  分类: Java |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
      java之间的web service调用简单,可以使用ide生成客户端,然后就可以直接使用客户端调用了。
      手上有个.net的web service服务,是http://...xxx.asmx这样的url,asmx页面上有方法使用说明,这个url加上?wsdl就是wsdl描述文件。尝试生成客户端,使用jdk wsimport方式如下:
wsimport -keep -d ../src/main/java -wsdlLocation ../src/resources/META-INF/service.wsdl
cxf也有生成客户工具wsdl2java,cxf wsdl2java用法如下:
wsdl2java -p net.greatsoft -d e:\ -client  http://localhost:8080/wenku/ws/userWs?wsdl
-p  指定其wsdl的命名空间,也就是要生成代码的包名:
-d  指定要产生代码所在目录
-client 生成客户端测试web service的代码
-server 生成服务器启动web  service的代码
-impl 生成web service的实现代码
-ant  生成build.xml文件
-all 生成所有开始端点代码
wsdl2java -p net.greatsoft -d e:\ -client  http://localhost:8080/wenku/ws/userWs?wsdl
      cxf生成的客户端与使用jdk生成的方式是一样的,它们有一样的错误:Error resolving component 's:schema'。在这里有位朋友讲到这种情况的解决方法:http://my.oschina.net/bayer/blog/52490。其中引起错误的那段xml是这样
<s:complexType>
    <s:sequence>
        <s:element ref="s:schema" />
        <s:any />
    </s:sequence>
</s:complexType>
<s:element ref="s:schema" />删掉,由于<s:any />可以代表任何元素,因此wsdl验证未报错,正常生成了客户端,并能够使用。但我遇到更复杂问题,wsdl文件中有这样一段
<s:complexType name="...">
<s:complexContent mixed="false">
<s:restriction base="soapenc:Array">
<s:sequence>
<s:element minOccurs="0" maxOccurs="unbounded" name="String"
type="s:string" />
</s:sequence>
</s:restriction>
</s:complexContent>
</s:complexType>
其中 base="soapenc:Array"又引发错误了,而这里不能像上面那样直接删除就能解决问题。
      尝试动态调用,不生成客户端的方式也是一样的错误:
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
Client client = dcf.createClient(SERVICE_URL);
      这应该就是wsdl验证时的错误,就算动态调用也是要经过这一步的。

      网上有总结,java内部web service调用使用cxf、跨语言环境则使用axis。而后就开始尝试axis2,axis2生成客户端工具的名称与cxf一样的,使用方式如下:
wsdl2java -uri http://...xxx.asmx?wsdl -p [package] -s -a -o [output]
其中常用的options具体如下:
  -d <databinding>   指定databingding,例如,adb,xmlbean,jibx,jaxme and jaxbri> WSDL2Java -uri myService?wsdl -d xmlbeans
  -u                展开data-binding的类
  -r <path>    为代码生成指定一个repository
  -ssi              为服务端实现代码生成接口类
  -S     为生成的源码指定存储路径
  -R     为生成的resources指定存储路径
  -g      生成服务端和客户端的代码
  -a      生成异步模式的代码
  -s      生成同步模式的代码
  -t      为代码生成测试用例
  -p <pkg>    指定代码的package名称
  -o <path>  指定生成代码的输出路径
  -l  <languange>     使用的语言(Java/C) 默认是java
  -pn <port_name>  当WSDL中有多个port时,指定其中一个port
  -sn <serv_name>  选择WSDL中的一个service
  --noBuildXML   输出中不生成build.xml文件
  --noWSDL        在resources目录中不生成WSDL文件
  --noMessageReceiver  不生成MessageReceiver类   
  -scn     用已有的代码代替skeletons
  -ss       生成服务端代码 默认不生成
  -sd       生成服务端描述文件services.xml,仅与-ss一同使用
  -ns2p 将namespace进行替换,多个中间用逗号隔开
      axis2生成的客户端很简单,就两个类,一个xxxCallBackHandler和一个xxxStub,不像jdk生成的客户端一样一大堆类。不是axis2客户端调用需引入axis2的jar包。而cxf客户端代码生成后,可不依赖cxf的包就直接调用web service。axis2客户端使用代码也很简单:
SimpleServiceStub stub = new SimpleServiceStub();
SimpleServiceStub.GetGreeting gg = new SimpleServiceStub.GetGreeting();
gg.setName("比尔");
System.out.println( stub.getGreeting(gg).get_return());
      axis2和cxf不要一起使用,我在同个项目里测试axis2和cxf,把它们的包依赖都添加进来后,原先axis2调用成功的例子,也出现了如cxf一样的对 soapenc:Array 的报错信息。估计是它们共同依赖的某个jar包版本不一致的原因,他们共同使用时,优先使用那个会引发错误的jar文件。
      到此,使用axis2可以使用java调用.net的web service服务。
  评论这张
 
阅读(2613)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017