`

Apache Axis 服务创建

阅读更多

  在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模式页面:

   

 

  成功执行后,我们可以看到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

 

 

 

 

 

  • 大小: 40.6 KB
分享到:
评论
1 楼 liqisong1985 2012-03-01  
神贴啊,大哥,你的太好了~我找了几个月,终于找到答案啦,原来真是服务端的问题啊!

相关推荐

    抛出无法找到主类:org.apache.axis.wsdl.WSDL2Java

    抛出无法找到主类:org.apache.axis.wsdl.WSDL2Java(Throws Could not find main class: org.apache.axis.wsdl.WSDL2Java)。 添加本文的jar包压缩包解压出来的所有jar包到当前使用的java.exe 命令的lib目录下的ext...

    axis服务端和客户端创建

    axis服务端和客户端创建,接口创建和调用。

    Axis1生成调用web服务的stub客户端所需jar包

    1.包含Axis1生成web服务的客户端stub类的所有jar包。 2.至于如何使用Axis1生成stub类型的客户端,请参考我的CSND博客,地址为http://blog.csdn.net/larry_lv/article/details/6708003

    wsdl2java源码-axis14_on_wildfly_swarm:该项目是我使用WildflySwarm捆绑ApacheAxis1.4S

    Apache Axis 1.4 SOAP RPC servlet 应用程序创建 uber-jar。 问题复制 要重现该问题,请从此目录运行mvn package ,然后尝试在target目录中运行创建的 jar 文件。 包示例 以下是从我的 IntelliJ IDEA IDE 为该项目...

    Developing Web Services with Apache Axis2

    这是最好的手把手教会你怎么去创建web service应用

    WebService大讲堂之Axis2,多个实例

    WebService大讲堂之Axis2,多个实例,非常全的文档,从新手入门开始到复杂的实例

    axis1.4 部署解析webservie

    1.TOMCAT+AXIS的安装配置 首先机子上应该安装JDK1.5版本以上(带有XML解析包)。我这里是1.5.0.6 ...注:HelloWorldService 的webservice已经创建在axis1.4.rar包内,只要运行axis项目即可访问到该webservice

    WebService:使用axis2创建Web服务的测试

    网络服务使用axis2创建Web服务的测试简单的设计,只是为了展示Web服务的工作方式

    axis应用jar包

    axis全称Apache EXtensible Interaction System 即阿帕奇可扩展交互系统。Axis本质上就是一个SOAP引擎,提供创建服务器端、客户端和网关SOAP操作的基本框架。Axis目前版本是为Java编写的,不过为C++的版本正在开发中...

    axis正式版

    axis全称Apache Extensible Interaction System 即阿帕奇可扩展交互系统。Axis本质上就是一个SOAP引擎,提供创建服务器端、客户端和网关SOAP操作的基本框架。Axis目前版本是为Java编写的,不过为C++的版本正在开发中...

    Apache Web Service(JAVA 必看)

    Woden项目是Apache Web Services项目演化而来的一个子项目,主要用来开发用于读/写、操作、创建WSDL文档的Java类库,在初始阶段支持WSDL2.0,但是随着开发的继续,将会支持各种版本的WSDL。 Woden主要包含了两部分...

    COS——R.log

    at org.apache.axis.server.AxisServer.invoke(AxisServer.java:281) at org.apache.axis.transport.http.AxisServlet.doPost(AxisServlet.java:699) at javax.servlet.http.HttpServlet.service(HttpServlet....

    webservice所有包

    axis全称Apache Extensible Interaction System 即阿帕奇可扩展交互系统。Axis本质上就是一个SOAP引擎,提供创建服务器端、客户端和网关SOAP操作的基本框架。Axis目前版本是为Java编写的,不过为C++的版本正在开发中...

    webserviceDemo

    ecplise中Wcxf创建及发布webservice及axis调用远程webservice实例. 我这边使用的Apache CXF+Spring,远程调用使用的是axis.其他方式也试过,个人觉得这样搭配比较方便的开发webservice

    gap:Dart 中 Apache Cordova 移动框架(又名 PhoneGap)的桥接实现。 它使开发人员能够使用 HTML、CSS 和 Dart 访问多个移动平台的本机设施

    Rikulo Gap 在 Apache 2.0 许可下分发。 ##从 Dart Pub 存储库安装将此添加到您的pubspec.yaml (或创建它): dependencies: rikulo_gap: "&gt;=0.6.0 &lt;0.7.0"##用法一切都从启用您的设备可访问性开始: import '...

    ASP EXCEL导入SQL

    它们的新的项目分别是ApacheCXF和Axis2.Java语言也制定关于REST网络服务规范:JAX-RS:JavaAPIforRESTfulWebServices(JSR311)。相信还会出现更多与REST相关的激动人心的信息。  REST与AJAX技术  尽管AJAX技术的...

    java开源包1

    同时,任何第三方都可以使用OAUTH认证服务,任 何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。业界提供了OAUTH的多种实现如PHP,JavaScript,Java,Ruby等各种语言开发包,大大节约了程序员的时间...

    java开源包11

    同时,任何第三方都可以使用OAUTH认证服务,任 何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。业界提供了OAUTH的多种实现如PHP,JavaScript,Java,Ruby等各种语言开发包,大大节约了程序员的时间...

    java开源包2

    同时,任何第三方都可以使用OAUTH认证服务,任 何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。业界提供了OAUTH的多种实现如PHP,JavaScript,Java,Ruby等各种语言开发包,大大节约了程序员的时间...

Global site tag (gtag.js) - Google Analytics