AXIS2发布WebServices服务

最近项目需用同时用c/c++、PHP、JAVA,由于编程语言多样性导致通讯无法正常使用。所有在这几种语言中采用WSDL进行通讯。将接口发布成WebService。发布的方法有多种就不都去介绍。 我们这儿使用的是axis2,使用这个的原因是c/c++同时也支持,但是c/c++怎么使用就不介绍了,毕竟我是负责JAVA服务端的。下面开始主要介绍。怎么使用这些,同时记录一些遇到的问题。

我所知的使用axis2的方式有两种,一是直接在axis2的项目里面下加入自己写的服务,一种是将axis2集成到自己的服务中。各有优缺点。

先介绍第一种吧,也是我这个项目中使用的。

一:将项目部署在Axis2里面

默认已经安装好 jdk 、tomcat 、eclipse

参与进来时主题框架已定。采用了简便的方式。因为这个公司主要研发力量是c/c++,能简便则简便吧。

1、在官网 http://axis.apache.org/axis2/java/core/download.cgi下载axis2,需要下载的是下面几个,路径如下,我这边下的是现在的最新版本1.7.6的。


2、在eclipse里面添加一个user Library,名称自己定,我这儿是axis2,把下载好的axis2-1.7.6-bin里面的所有的jar包放入进去。


我这儿是已经建好了的。如果没创建,如下图所示点击NEW添加。名字自己定。


找到你下载的axis2-bin,导入jar。(这部分开始忘记说明,今天在公司才想起,现在加上。公司用的并不是最新的axis2。),因为后续都要使用到axis2的jar,所有一次性全弄进去。


3、然后直接把下载的axis2.war里面的拷贝到tomcat服务器下的webapps里面去,直接运行tomcat。会自动生成一个axis2文件。这里面就是以后自己写的webService程序存放的地方。


这时,访问http://localhost:8080/axis2/你就会发现已经集成好了。


4、安装eclispe axis2插件用来打包arr发布。首先用官网下载的axis2-eclipse-codegen-plugin和axis2-eclipse-service-plugin两个,解压的jar放入eclipse的dropins里面,期间要关闭eclipse。


然后在eclipse里面File->new->axis2,如果出现下面两个就表示成功了。没有的话可以百度看看怎么导致的,可能是eclipse版本不兼容或者其他问题。


5、建立一个简易的demo程序:主要内容如下


6、接下来打包发布,File->New->axis2->Axis2 Service Archiver

选择当前项目的classes目录


接下来next


下面是jar包添加,如果当前项目有别的导入包则需要一个一个加进去,我这儿的demo并没有,直接next。


继续next.



Service Name 是发布的Webservices名字,也就是以后调用时的名字。class name则是编译文件的路径。


最后一步,Output file location 就是arr路径生成后的位置,我这儿是直接放到发布的路径。

output File Name是arr的名字,建议与项目名或者WebServices接口相同。


实际发布如下,可以将arr文件解压成文件夹形式,因为后续可能需要修改里面的东西。


重启tomcat后,继续访问http://localhost:8080/axis2/services/listServices 和http://localhost:8080/axis2/services/WebServicesDemo/firstDemo,如果如下面所示就表示发布成功。



路径绝对不能输错,要不然会出现如下情况


7、如果后续需要修改发布的webService的话,只需要替换掉里面的class文件就好。


8、如果在同一个项目里面发布多个webService的话可以直接修改arr里面的services.xml文件。同时把class文件以及路径加到对应的位置。services.xml位置在服务器下的axis2里面,我这儿是 D:\tomcat\webapps\axis2\WEB-INF\services\WebServicesDemo\META-INF。


例如在同时发布另外一个demo接口。

先修改service.xml文件。这是修改前的样子。 name就是在用axis2插件时的名称。

<service name="WebServicesDemo" >
	<description>
		Please Type your service description here
	</description>
	<messageReceivers>
		<messageReceiver mep="http://www.w3.org/ns/wsdl/in-only" class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
		<messageReceiver  mep="http://www.w3.org/ns/wsdl/in-out"  class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
	</messageReceivers>
	<parameter name="ServiceClass">com.yzz.webservice.demo.WebServicesDemo</parameter>
</service>

修改后如下所示

<serviceGroup>
<service name="WebServicesDemo" >
	<description>
		Please Type your service description here
	</description>
	<messageReceivers>
		<messageReceiver mep="http://www.w3.org/ns/wsdl/in-only" class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
		<messageReceiver  mep="http://www.w3.org/ns/wsdl/in-out"  class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
	</messageReceivers>
	<parameter name="ServiceClass">com.yzz.webservice.demo.WebServicesDemo</parameter>
</service>
<service name="demo" >
	<description>
		Please Type your service description here
	</description>
	<messageReceivers>
		<messageReceiver mep="http://www.w3.org/ns/wsdl/in-only" class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
		<messageReceiver  mep="http://www.w3.org/ns/wsdl/in-out"  class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
	</messageReceivers>
	<parameter name="ServiceClass">com.yzz.webservice.demo.Demo</parameter>
</service>
</serviceGroup>

继续访问http://localhost:8080/axis2/services/listServices 就可以看到新加的webServices接口demo了。


第一种方法介绍完毕,下面说这个方法存在的优点已经缺陷。

优点:适合新项目,无需考虑各种兼容问题。

缺点:

一:不方便调试,必须把编译好的class文件替换重新发布才能看到效果。

二:及其奇葩的一个问题,上图说明。

这是发布成功的情况。


但是,如果在tomcat开启的时候,有别的服务器(c/c++写的soap服务器)在访问我们的接口,会导致一个问题,

里面的这个路径 <soap:address location="http://localhost:8080/axis2/services/demo.xxx/"/>

会变成这样<soap:address location="http://localhost:8080//axis2/services/demo.xxx/"/>axis2前面会多一个 / 。所有的调用都无法正常运行。这个路径是服务自动生成的,也不清楚怎么改。唯一避免的方式就是确保没有被调用的情况下开启服务器。

我个人觉得是在tomcat服务器重启或者开启的时候会按默认路径 http://localhost:8080/axis2/services/demo.xxx/ 来生成对应外部的调用路径,但是此时有服务器在访问该路径,导致这个路径被占用。所以tomcat自动产生了另外一个路径。也就是我们后续看到的那个多了一个反斜杠的路径。暂时不清楚如何解决。


第二种方式。

这种是直接把axis2集成到自己的项目种去。这种是更加符合现在大部分项目的需求的发布方式。

1、将第一种方式下载的axis2.war解压开,去WEB-INF里面找conf、lib、modules、services,也可以到tomcat我们第一种方法里面集成的axis2的WEB-INF里面的去找 这几个文件。


2、把这些文件夹拷贝到现有项目的WEB-INF里面去。然后在项目的web.xml中加上启动配置。目的是tomcat启动的时候自动加载axis2。

 <servlet>    
   	<servlet-name>AxisServlet</servlet-name>    
    	<servlet-class>org.apache.axis2.transport.http.AxisServlet</servlet-class>    
    <load-on-startup>1</load-on-startup>    
</servlet>  
 
<servlet-mapping>    
    <servlet-name>AxisServlet</servlet-name>    
    <url-pattern>/services/*</url-pattern>    
</servlet-mapping> 
</web-app>
3、接下来建立文件夹,如果是用过第一种方法而且后面是按我上面说的一样直接从tomcat里面拷贝过来的话,那就无需后面的步骤了,直接访问http://localhost:8080/WebServices2/services/WebServicesDemo?wsdl就行了。因为我们第一种方法已经完全配置好了。


4、如果没有用第一种方法的话。那就继续看下去吧。如图所所示,建立文件夹,java文件以及services.xml。我这儿偷懒了,直接把原来的java文件以及services.xml的配置全部复用了。主要步骤是在services目录建立文件夹,这个名字可以自己定。然后在继续建立文件夹META-INF(这个是必须按格式来)。



5、添加xml文件services.xml。具体内容如下,和上面第一种方法的图一样。

<serviceGroup>
<service name="WebServicesDemo" >
	<description>
		Please Type your service description here
	</description>
	<messageReceivers>
		<messageReceiver mep="http://www.w3.org/ns/wsdl/in-only" class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
		<messageReceiver  mep="http://www.w3.org/ns/wsdl/in-out"  class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
	</messageReceivers>
	<parameter name="ServiceClass">com.yzz.webservice.demo.WebServicesDemo</parameter>
</service>
<service name="demo" >
	<description>
		Please Type your service description here
	</description>
	<messageReceivers>
		<messageReceiver mep="http://www.w3.org/ns/wsdl/in-only" class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
		<messageReceiver  mep="http://www.w3.org/ns/wsdl/in-out"  class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
	</messageReceivers>
	<parameter name="ServiceClass">com.yzz.webservice.demo.Demo</parameter>
</service>
</serviceGroup>
6、经过这样配置后直接访问http://localhost:8080/WebServices2/services/WebServicesDemo?wsdl 或者http://localhost:8080/WebServices2/services/demo?wsdl就可以成功看到结果。 

7、如果项目除了发布WebService还有其他传统型接口,还需要其他更改。例如在SpringMvc里面同时加入axis2的话。service.xml里面的配置如下(这个与现在的两个Demo无关,等具体项目集成好了在详细介绍)。

<serviceGroup> 
<service name="AxisService">
	<description>AxisService</description>
	<parameter name="ServiceClass">
		com.cms.userdao.UserDao
	</parameter>
	
	<operation name="axis2Login" >
        <messageReceiver  mep="http://www.w3.org/2004/08/wsdl/in-out" class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
    </operation>
</service>

<service name="SpringJdbcService">

        <description>Multy Method Invoke With Parameters For Spring</description>
		<!-- <parameter name="ServiceObjectSupplier">org.apache.axis2.extensions.spring.receivers.SpringServletContextObjectSupplier</parameter> -->
		<parameter name="ServiceObjectSupplier">org.apache.axis2.extensions.spring.receivers.SpringAppContextAwareObjectSupplier</parameter>
		<parameter name="SpringBeanName">springAwareService</parameter>//springMvc中bean的配置后续有介绍
		<operation name="getName">//需要发布的接口
           <messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
        </operation>
 
	</service>

</serviceGroup>


springMvc发布axis2

需要在springmvc的配置文件applicationContext.xml里面加入以下配置

<!-- axis2发布接口的配置 -->
	<bean id="springJdbcBean" class="com.cms.demo.SpringJdbcBeanImpl">
  		<property name="dataSource" ref="dataSource" />
  	</bean>
	<bean id="springAwareService" class="com.cms.demo.SpringAwareService">
    	<property name="springJdbcBean" ref="springJdbcBean"/>
  	</bean>

这种方法的优点是调试简便、方便部署已有的项目。

缺点就是,如果你的项目同时需要发布webService或者普通的接口的话,需要而外的配置。


以上全部是是自己亲自搭建可以正确使用,如有不对之处,欢迎大家指正。

下一篇介绍几种java端调用webServices的方法。


源码下载 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章