设为首页 收藏本站
查看: 749|回复: 0

[经验分享] Apache Axis 服务创建

[复制链接]

尚未签到

发表于 2017-1-1 09:55:08 | 显示全部楼层 |阅读模式
  在Apache Axis了解一文中,已经对Apache Axis建立了一个大概认识,在这一博文里呢,通过常用的三种方式来创建一些Axis支持的Web服务,分别为:Dynamic Invocation Interface(DII)、Dynamic Proxy以及Stubs。
  DII和Dynamic Proxy这两种方式呢,一般来说,企业级的应用不是很多了,所以,主要介绍一下Stub方式:
  Stubs
:这个方法在企业级的应用就太广了,当然了FedEx和UPS的Axis方式,就是使用的这种,现在来介绍一个具体的例子,这里传入的参数就为一个bean实例,这其中也解决了一直头疼的:org.xml.sax.SAXException: Deserializing parameter 'arg0':  could not find deserializer for type...
异常,现在正式来开始我们的stubs发布之旅:
  新建一个java工程:axisStubsServiceDemo,导入相应的axis的jar包,然后我们新建一个User的类


private    String username;
private    int         age;
  非常的简单了,就姓名和年龄两属性,getter和setter方法相当是必须的了。
  然后呢,再新建一个操作该User实体的Service服务类:UserInfoService,现列出具体代码


/**
* 添加一个用户的基本信息
* @param user 用户实例
* @return String SUCCESS/FAIL
* */
public String addUser(User user){
if(null!=user){
return ReturnFlag.SUCCESS.toString();
}else{
return ReturnFlag.FAIL.toString();
}
}
  也没什么,就是一添加用户操作,如果转入的实体不为空,我们就认为创建成功,相当简单和不严谨的逻辑,但只为示例,所以,不深究!当然了,这两个文件都位于com.axisstubs.demo包下,把此两个类文件编译完拷贝到axis\WEB-INF\classes目录下

  编写一deploy.wsdd文件,具体内容如下


<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="UserInfoService" provider="java:RPC">
<parameter name="className" value="com.axisstubs.demo.UserInfoService"/>
<parameter name="allowedMethods" value="*"/>
</service>
</deployment>
  就是用于发布此UserInfoService服务了。服务名为UserInfoService,对应的类全路径为com.axisstubs.demo.UserInfoService,把此deploy.wsdd文件拷贝到WEB-INF目录下,并在此目录下,新建一generate-server-config.bat文件,具体内容如下:


set AXIS_LIB=G:\workspace\AXIS_HOME\lib
set Java_CMD=java -Djava.ext.dirs=%AXIS_LIB%
%Java_CMD% org.apache.axis.client.AdminClient deploy.wsdd
cmd
  双击运行,如果一切jar及类信息正常,你可以看到如下大概的cmd模式页面:
DSC0000.jpg

  成功执行后,我们可以看到WEB-INF目录下多了个server-config.wsdd
文件,此文件是AXIS的服务描述文件,所以发布的服务均可在这里找到,所以,在浏览器里输入http://localhost:8080/axis/servlet/AxisServlet看看我们的服务有没有发布成功就显而易见了。如何你对AXIS以及wsdd研究得够好,你可以直接修改server-config.wsdd创建并修改Web服务。
  到目前为止,AXIS的服务发布算是完成了。
  现在我们来生成访问此服务的客户端:
  生成访问服务器端的客户端,我们有理由相当,客户端绝对是一些类代码,在Axis的API里,有这样的两个工具类,分别为:org.apache.axis.wsdl.Java2WSDL以及org.apache.axis.wsdl.WSDL2Java,可以从这两个类看出来,Java2WSDL就是把Java类文件生成WSDL,而WSDL2Java呢,则是WSDL生成Java代码,我们的Java代码有了,客户端的代码,我们就用org.apache.axis.wsdl.WSDL2Java了,怎么获取到WSDL文件呢,既然服务已经发布了,那WSDL文件的获取自然就不在话下了:http://localhost:8080/axis/services/UserInfoService?wsdl,拷贝网页的内容到UserInfoService.wsdl并放入项目的根目录
。现在我们就来根据此wsdl文件来生成对应的客户端文件吧,为此编写了一个WSDL2Java.bat文件:

set AXIS_LIB=G:\workspace\AXIS_HOME\lib
set JAVA_CMD=java -Djava.ext.dirs=%AXIS_LIB%
set OUTPUT_PATH=G:\workspace\axisStubsServiceDemo\src
set Package=com.axisstubs.demo.client
%JAVA_CMD% org.apache.axis.wsdl.WSDL2Java -o%OUTPUT_PATH% -p%Package% UserInfoService.wsdl
cmd
  如果一切正常的话,那么在你的工程com.axisstubs.demo.client包下应该会生成五个文件,分别为:User.java、UserInfoService_PortType.java、UserInfoServiceSerivce.java、UserInfoServiceServiceLocator.java以及UserInfoServiceSoapBindingStub.java

  OK,所有的一切都已准备就绪了,就差运行测试了哇,传入不为空的User实例,返回SUCCESS,否则返回FAIL:

        UserInfoServiceService service = new UserInfoServiceServiceLocator();//Service
UserInfoServiceSoapBindingStub client = new UserInfoServiceSoapBindingStub(new URL(service.getUserInfoServiceAddress()),service);
User user = new User();
user.setUsername("kevin cui");
user.setAge(25);
String retValue = client.addUser(user);
System.out.println(retValue);
  运行结果如下:

Exception in thread "main" AxisFault
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
faultSubcode:
faultString: org.xml.sax.SAXException: Deserializing parameter 'user':  could not find deserializer for type {http://localhost:8080/axis/services/UserInfoService}User
faultActor:
faultNode:
faultDetail:
{http://xml.apache.org/axis/}hostname:cuics
  出错了。它是在告诉我们,在反序列化user参数的时侯找不到反序列化User类型,没有注册序列化和反序化?对的:
  在server-config.wsdd的UserInfoService服务里加入如下:

  <typeMapping deserializer = "org.apache.axis.encoding.ser.BeanDeserializerFactory"   
encodingStyle = "http://schemas.xmlsoap.org/soap/encoding/"   
qname = "ns1:User"   
serializer = "org.apache.axis.encoding.ser.BeanSerializerFactory"   
type = "java:com.axisstubs.demo.User"
xmlns:ns1 = "http://localhost:8080/axis/services/UserInfoService"/>



  重启服务,运行:

SUCCESS
  噢耶,搞定!对自定义bean类未注册,通常是导致我们无法成功运行的原因,此问题也困扰了我好长时间,google了好久才找到,希望对大家会有所帮助。另附上源代码:axisStubsServiceDemo.rar

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-322298-1-1.html 上篇帖子: Apache Common-Mail发送邮件 下篇帖子: Apache Wicket 学习 (准备)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表