一、搭建WebService服務端
搭建webservice服務端一般有兩種情況
1.1 從0搭建webService服務端
首先引入jar包
<!--cxf--> <!-- https://mvnrepository.com/artifact/org.apache.cxf/cxf-rt-frontend-jaxws --> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> <version>3.1.6</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.cxf/cxf-core --> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-core</artifactId> <version>3.1.6</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.cxf/cxf-rt-transports-http --> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http</artifactId> <version>3.1.6</version> </dependency>
然后新建service,這里就面向接口了,直接新建一個calss類
package cn.wanghao.server; import javax.jws.WebService; @WebService public class HelloWordWebServie { public String say(String parm1,int parm2){ System.out.println("測試測試"+parm1); return "測試"; } }
然后定義Servlet,攔截webservice開頭的請求
<!--定義一個cxf的servlet--> <servlet> <servlet-name>CXFServlet</servlet-name> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>CXFServlet</servlet-name> <url-pattern>/webservice/*</url-pattern> </servlet-mapping>
然后把我們的webservice類教給Spring管理
<import resource="classpath:META-INF/cxf/cxf.xml"/> <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/> <bean id="hello" class="cn.wanghao.server.HelloWordWebServie" /> <jaxws:endpoint id="helloWorld" implementor="#hello" address="/HelloWorld" /> <!-- <jaxws:endpoint id="helloWorld" implementor="cn.wanghao.server.HelloWordWebServie" address="/HelloWorld"/>-->
如果引入上面的需要增加約束
xmlns:jaxws="http://cxf.apache.org/jaxws"
......
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
然后訪問:http://localhost:8080/webservice 可以看到我們已經發布成功,點擊url鏈接可以看到wsdl內容。
可以看到成功了,但是我們的參數名稱是arg0,看起來很難閱讀,我們可以修改參數名稱。不建議用中文,此處測試用
重啟tomcat后訪問如下:
注:我們把這個wsdl內容保存下來,取名后后綴為.wsdl,下面會用到
1.1 根據wsdl生成服務端
由於我沒有系統學過,所以對webService了解的也不是很多,粗略理解webService就是根據這個wsdl規范的請求和訪問。
所以可能業務需求需要你根據wsdl生成服務端供其他人調用。所以就會給你一個wsdl,你依據wsdl寫服務端。
開始了,首先把之前保存的wsdl文件復制到項目下面,如下:
點擊確定生成服務端代碼,還在當前目錄下,可能名字不一樣,但是文件差不多
然后重寫實現類:
package cn.wanghao.server.test; public class HelloWordWebServieServiceSoapBindingImpl implements cn.wanghao.server.test.HelloWordWebServie{ public java.lang.String say(java.lang.String desc, int status) throws java.rmi.RemoteException { return "你的參數為: desc "+desc+" status:" +status; } }
注:這里不止生成了這幾個文件。還會生成一個server-config.wsdd 該文件與web.xml同級,以及web.xml多了很多代碼如下:
報錯是因為缺少jar包,我們依賴第三方包即可:
<!-- https://mvnrepository.com/artifact/org.apache.axis/axis --> <dependency> <groupId>org.apache.axis</groupId> <artifactId>axis</artifactId> <version>1.4</version> </dependency>
不報錯之后,我們拷貝deploy.wsdd 里面的service到server-config.wsdd 與里面的service標簽同級即可
service的名字可以自己修改,
然后啟動項目提示少包,依次根據報錯引入這兩個包,然后啟動OK,
<!-- https://mvnrepository.com/artifact/org.apache.axis/axis-jaxrpc --> <dependency> <groupId>org.apache.axis</groupId> <artifactId>axis-jaxrpc</artifactId> <version>1.4</version> </dependency> <!-- https://mvnrepository.com/artifact/commons-discovery/commons-discovery --> <dependency> <groupId>commons-discovery</groupId> <artifactId>commons-discovery</artifactId> <version>0.2</version> </dependency>
訪問項目:http://localhost:8080/services
前面的是自帶的,最下面的是我自己的,多余的暴露接口也可以刪除,然后點擊我們接口進去后跟上面的一樣
然后保存好這個wsdl,下面會用到
二、使用wsdl編寫客戶端
其實webService客戶端調用直接main方法就可以調用,不用啟服務,所以上面的項目不用關閉,另外啟動項目進行調用。jar包以及引入好了。
注意不要有用中文,之前的中文只是測試使用,這里需要規范屬性名稱
這里生產客戶端
生成結構如下:
調用main方法如下:
package example.other; import cn.wanghao.server.test.HelloWordWebServieServiceLocator; import javax.xml.rpc.ServiceException; import java.rmi.RemoteException; public class HelloCallWebServiceTest { public static void main(String[] args) throws ServiceException, RemoteException { HelloWordWebServieServiceLocator locator = new HelloWordWebServieServiceLocator(); // 設置webService調用地址,可以寫在生成類里面 // locator.setHelloWordWebServiePortEndpointAddress("http://localhost:8080/services/HelloWordWebServiePort?wsdl"); String result = locator.getHelloWordWebServiePort().say("測試參數", 1); System.out.println("HelloCallWebServiceTest 返回參數為:"+result); } }
執行后返回,與我們的的webServicce 實現對應
這里就不測試第一種方法了,以上就是spring集成webService並互相調用,有問題可以留言討論。
參考文章:
https://blog.csdn.net/fhliuzhihu/article/details/78115828
https://blog.csdn.net/zty1317313805/article/details/80254751
http://cxf.apache.org/docs/writing-a-service-with-spring.html