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