最近项目需用同时用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的方法。