webservice 服務端例子+客戶端例子+CXF整合spring服務端測試+生成wsdl文件 +cxf客戶端代碼自動生成


首先到CXF官網及spring官網下載相關jar架包,這個不多說。webservice是干嘛用的也不多說。

門例子

    模擬新增一個用戶,並返回新增結果,成功還是失敗。


   大概的目錄如上,很簡單。

ResultInfo.java

 

[java] view plain copy 在CODE上查看代碼片 派生到我的代碼片
  1. package com.fei.webservice.user.bean;  
  2.   
  3. import java.text.MessageFormat;  
  4.   
  5. import javax.xml.bind.annotation.XmlAccessorType;  
  6. import javax.xml.bind.annotation.XmlAttribute;  
  7. import javax.xml.bind.annotation.XmlType;  
  8. import javax.xml.bind.annotation.XmlAccessType;  
  9.   
  10. @XmlAccessorType(XmlAccessType.FIELD)  
  11. @XmlType(name = "ResultInfo", namespace = "http://bean.user.webservice.fei.com/")  
  12. public class ResultInfo {  
  13.   
  14.     @XmlAttribute(required = true)  
  15.     private String code;  
  16.     @XmlAttribute  
  17.     private String message;  
  18.       
  19.     public ResultInfo(){  
  20.         super();  
  21.     }  
  22.     public ResultInfo(String code,String message){  
  23.         super();  
  24.         this.code = code;  
  25.         this.message = message;  
  26.     }  
  27.     public String getCode() {  
  28.         return code;  
  29.     }  
  30.   
  31.     public String getMessage() {  
  32.         return message;  
  33.     }  
  34.   
  35.     public void setCode(String code) {  
  36.         this.code = code;  
  37.     }  
  38.   
  39.     public void setMessage(String message) {  
  40.         this.message = message;  
  41.     }  
  42.   
  43.     @Override  
  44.     public String toString() {  
  45.         return MessageFormat  
  46.         .format("[code={0},message={1}]",  
  47.                 code,  
  48.                 message);  
  49.     }  
  50. }  


IUserService.java

[java] view plain copy 在CODE上查看代碼片 派生到我的代碼片
  1. package com.fei.webservice.user;  
  2.   
  3. import javax.jws.WebParam;  
  4. import javax.jws.WebService;  
  5.   
  6. import com.fei.webservice.user.bean.ResultInfo;  
  7.   
  8. @WebService  
  9. public interface IUserService {  
  10.   
  11.     ResultInfo createUser(  
  12.             @WebParam(name = "name") String name,  
  13.             @WebParam(name = "password") String password);  
  14. }  

UserService.java

[java] view plain copy 在CODE上查看代碼片 派生到我的代碼片
  1. package com.fei.webservice.user;  
  2.   
  3. import javax.jws.WebService;  
  4.   
  5. import com.fei.webservice.user.bean.ResultInfo;  
  6.   
  7.   
  8. @WebService(  
  9.         endpointInterface = "com.fei.webservice.user.IUserService",   
  10.         targetNamespace = "http://user.webservice.fei.com/",  
  11.         serviceName = "IUserService")  
  12. public class UserService implements IUserService{  
  13.   
  14.     public final String SUCCESS = "0000";  
  15.     public final String FAIL = "1001";  
  16.       
  17.     @Override  
  18.     public ResultInfo createUser(String name, String password) {  
  19.         //做業務  
  20.         System.out.println("新增用戶:name="+name+",password="+password);  
  21.         //通知第三方操作結果  
  22.         return new ResultInfo(SUCCESS,"用戶新增成功!");  
  23.     }  
  24.   
  25. }  



ServerStart.java

[java] view plain copy 在CODE上查看代碼片 派生到我的代碼片
  1. package com.fei;  
  2.   
  3. import javax.xml.ws.Endpoint;  
  4.   
  5. import com.fei.webservice.user.UserService;  
  6.   
  7. public class ServerStart {  
  8.   
  9.     public static void deployService() {  
  10.         System.out.println("Server start ……");  
  11.         UserService service = new UserService();  
  12.         String address = "http://localhost:9000/userService";  
  13.         Endpoint.publish(address, service);  
  14.     }  
  15.       
  16.     public static void main(String[] args) throws InterruptedException {  
  17.         //發布WebService  
  18.         deployService();  
  19.         System.out.println("server ready ……");  
  20.       
  21.     }  
  22. }  

ServerStart.java是用來發布接口的,可以理解為像tomcat那樣啟動后,瀏覽器就可以訪問了。

ClientTest.java

 

[java] view plain copy 在CODE上查看代碼片 派生到我的代碼片
  1. package com.fei;  
  2.   
  3. import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;  
  4.   
  5. import com.fei.webservice.user.IUserService;  
  6.   
  7. public class ClientTest {  
  8.   
  9.      public static void main(String[] args) {  
  10.             //調用WebService  
  11.             JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();  
  12.             factory.setServiceClass(IUserService.class);  
  13.             factory.setAddress("http://localhost:9000/userService");  
  14.               
  15.             IUserService service = (IUserService) factory.create();  
  16.             System.out.println("[result]" + service.createUser("張三", "1111"));  
  17.         }  
  18. }  

ClientTest.java模擬第三方調用接口。也就是對服務端(ServerStart.java啟動的那個)是否成功,客戶端和服務端的通訊是否OK。


    執行ServerStart.java,看到這樣的信息:


   啟動OK。接下來,用瀏覽器訪問,看看是否有xml格式的內容。

  訪問地址:http://localhost:9000/userService?wsdl

 


   好了,服務端OK了,我們用客戶端來調用服務端的接口,看看效果。

  測試方法一:

   執行ClientTest.java,控制台顯示如下信息:


   可以看到服務端返回了一個結果對象ResultInfo給客戶端,告訴客戶服務端新增用戶成功了。

  測試方法二

    使用SOUP-UI來測試,自己網上下載。





CXF整合spring

  在WEB-INF下新增一個spring-cxf.xml文件(和web.xml同目錄)。

 

[html] view plain copy 在CODE上查看代碼片 派生到我的代碼片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  4.     xmlns:jaxws="http://cxf.apache.org/jaxws"  
  5.     xsi:schemaLocation="  
  6.  http://www.springframework.org/schema/beans   
  7.  http://www.springframework.org/schema/beans/spring-beans.xsd   
  8.  http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">  
  9.    
  10.     <import resource="classpath:META-INF/cxf/cxf.xml" />  
  11.     <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />  
  12.     <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />  
  13.       
  14.     <jaxws:endpoint id="userService"  
  15.         implementor="com.fei.webservice.user.UserService"   
  16.         address="/userService" />  
  17. </beans>   


web.xml

 

[html] view plain copy 在CODE上查看代碼片 派生到我的代碼片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="3.0"   
  3.     xmlns="http://java.sun.com/xml/ns/javaee"   
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  5.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
  6.     http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">  
  7.     
  8.     
  9.   <context-param>    
  10.         <param-name>contextConfigLocation</param-name>    
  11.         <param-value>/WEB-INF/spring-cxf.xml</param-value>    
  12.     </context-param>    
  13.     <listener>    
  14.         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>    
  15.     </listener>    
  16.     <servlet>    
  17.         <servlet-name>CXFServlet</servlet-name>    
  18.         <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>    
  19.         <load-on-startup>1</load-on-startup>    
  20.     </servlet>    
  21.     <servlet-mapping>    
  22.         <servlet-name>CXFServlet</servlet-name>    
  23.         <url-pattern>/cxf/*</url-pattern>    
  24.     </servlet-mapping>    
  25.     
  26.       
  27.   <welcome-file-list>  
  28.     <welcome-file>index.jsp</welcome-file>  
  29.   </welcome-file-list>  
  30. </web-app>  


  將項目部署到tomcat下,啟動tomcat。

 瀏覽器訪問:http://localhost:8080/cxfwebserviceserver/cxf/userService?wsdl

 


   測試也有2種方法,和上面一樣,只是改變訪問地址而已,這里就不重復了。


生成wsdl文件

    服務端代碼完成,並發布之后,我們需要將接口的信息生成一個wsdl文件,給第三方,第三方拿到wsdl文件后,通過工具生成代碼。

   方法一:

   最方便,最快捷的辦法。服務端啟動后,瀏覽器訪問時,得到的信息,將網頁另存為,文件的后綴用.wsdl,這樣就得到wsdl文件了。

  注意:用這種方法,瀏覽器使用IE,本人試過百度瀏覽器,360瀏覽器,網頁另存時,它會將一些html的標簽也搞出來了。wsdl文件是一個xml格式的文件。

  推薦使用方法一,方法二生成的wsdl文件有點問題,不知道是工具的問題還是代碼寫漏了哪些注解配置。

   方法二:

    使用cxf的java2wsdl.bat工具來生成。

    簡單點的:

      將classes文件下的com全部copy到cxf工具的bin目錄下。cmd打開DOS窗口切換到bin目錄下,然后使用命令

    java2wsdl -cp ./com com.fei.webservice.user.IUserService

  

   自動生成了IUserServiceService.wsdl文件。

  麻煩點的:

  1.打包,將代碼打包成jar

  




  在桌面上生成一個userservice.jar包,把該包copy到java2wsdl.bat的同目錄下.cmd開打DOS窗口,切換到java2wsdl.bat目錄下。執行命令:

java2wsdl -cp .\userservice.jar com.fei.webservice.user.IUserService


 然后在目錄下,會生成一個IUserService.wsdl文件。



驗證wsdl文件

    生成了wsdl文件,交給第三方之前,最好驗證一下,使用它能否正確生成代碼。

   1.

      用記事本或者瀏覽器打開查看wsdl文件,拉到最后,看看wsdl:port name那里是否和通過

http://localhost:8080/cxfwebserviceserver/cxf/userService?wsdl訪問得到的一致。


    上面介紹wsdl文件的生成用了2中方法。方法一通過IE瀏覽器的另存為得到wsdl文件,我命名為userService.wsdl.方法二通過java2wsdl自動生成的wsdl文件為IUserServiceService.wsdl.

     查看userService.wsdl

   

   上面紅色框圈住的部分是我們期待的。

   接下來查看IUserServiceService.wsdl文件



  發現居然不是我們期待的,本人暫時找不到原因,為何導致這樣。我們就暫時使用方法一來生成wsdl文件吧

2.

  通過wsdl2java.bat工具,生成客戶端源碼,看看能否正確生成。

  cmd打開DOS窗口,切換到wsdl2java.bat目錄下,使用命令:

wsdl2java -client -server -impl .\userService.wsdl

  在同目錄下,會生成代碼



   為了方便,查看生成的代碼的結構,我新建一個java項目,把新生成的代碼copy進去。



     我們來看看圖上用箭頭指向的那個類。

 

[java] view plain copy 在CODE上查看代碼片 派生到我的代碼片
  1. package com.fei.webservice.user;  
  2.   
  3. import java.net.MalformedURLException;  
  4. import java.net.URL;  
  5. import javax.xml.namespace.QName;  
  6. import javax.xml.ws.Service;  
  7. import javax.xml.ws.WebEndpoint;  
  8. import javax.xml.ws.WebServiceClient;  
  9. import com.fei.webservice.user.IUserService;  
  10.   
  11. /** 
  12.  * This class was generated by Apache CXF (incubator) 2.0.4-incubator 
  13.  * Sat Jun 28 15:05:37 CST 2014 
  14.  * Generated source version: 2.0.4-incubator 
  15.  *  
  16.  */  
  17.   
  18. @WebServiceClient(name = "IUserService", targetNamespace = "http://user.webservice.fei.com/", wsdlLocation = "file:./userService.wsdl")  
  19. public class IUserService_Service extends Service {  
  20.   
  21.     public final static URL WSDL_LOCATION;  
  22.     public final static QName SERVICE = new QName("http://user.webservice.fei.com/", "IUserService");  
  23.     public final static QName UserServicePort = new QName("http://user.webservice.fei.com/", "UserServicePort");  
  24.     static {  
  25.         URL url = null;  
  26.         try {  
  27.             url = new URL("file:./userService.wsdl");  
  28.         } catch (MalformedURLException e) {  
  29.             System.err.println("Can not initialize the default wsdl from file:./userService.wsdl");  
  30.             // e.printStackTrace();  
  31.         }  
  32.         WSDL_LOCATION = url;  
  33.     }  
  34.   
  35.     public IUserService_Service(URL wsdlLocation) {  
  36.         super(wsdlLocation, SERVICE);  
  37.     }  
  38.   
  39.     public IUserService_Service(URL wsdlLocation, QName serviceName) {  
  40.         super(wsdlLocation, serviceName);  
  41.     }  
  42.   
  43.     public IUserService_Service() {  
  44.         super(WSDL_LOCATION, SERVICE);  
  45.     }  
  46.   
  47.     /** 
  48.      *  
  49.      * @return 
  50.      *     returns UserServicePort 
  51.      */  
  52.     @WebEndpoint(name = "UserServicePort")  
  53.     public IUserService getUserServicePort() {  
  54.         return (IUserService)super.getPort(UserServicePort, IUserService.class);  
  55.     }  
  56.   
  57. }  


    看到了嗎?

   @WebServiceClient(name = "IUserService", targetNamespace = "http://user.webservice.fei.com/"

   @WebEndpoint(name = "UserServicePort")

   特別是UserServicePort一定要和用瀏覽器訪問服務端時界面顯示的那個一樣(上面截圖中用紅色框圈住的那個wsdl:port name = "UserServicePort")


驗證wsdl生成的代碼是否可用

       把wsdl文件給第三方之前,一定要確保wsdl文件是沒問題的,生成出來的代碼也是OK的。所以把wsdl文件給第三方之前還有最后一步要做。驗證wsdl生成的代碼是否可用.

   看到上面給的目錄結構圖了嗎?我新曾了org.fei.service.UserService.java以及UserServiceTest.java

   UserService.java

 

[java] view plain copy 在CODE上查看代碼片 派生到我的代碼片
  1. package org.fei.service;  
  2.   
  3. import java.net.URL;  
  4.   
  5. import com.fei.webservice.user.IUserService;  
  6. import com.fei.webservice.user.IUserService_Service;  
  7. import com.fei.webservice.user.bean.ResultInfo;  
  8.   
  9. public class UserService {  
  10.   
  11.     private final static String _URL = "http://localhost:8080/cxfwebserviceserver/cxf/userService?wsdl";  
  12.     //wsdl生成的接口  
  13.     private IUserService userService;  
  14.       
  15.     public UserService()  {  
  16.         try {  
  17.             userService = new IUserService_Service(new URL(_URL)).getUserServicePort();  
  18.         } catch (Exception e) {  
  19.             e.printStackTrace();  
  20.             throw new RuntimeException("用戶接口初始化連接出錯!",e);  
  21.         }  
  22.     }  
  23.       
  24.     public boolean addUser(String name,String password){  
  25.         boolean isSuccess = false;  
  26.         try {  
  27.             ResultInfo result = userService.createUser(name, password);  
  28.             if("0000".equals(result.getCode())){  
  29.                 isSuccess = true;  
  30.                 System.out.println("新增用戶操作結果:成功!");  
  31.             }else{  
  32.                 isSuccess = false;  
  33.                 System.out.println("新增用戶操作結果:失敗!");  
  34.             }  
  35.         } catch (Exception e) {  
  36.             e.printStackTrace();  
  37.             isSuccess = false;  
  38.         }  
  39.         return isSuccess;  
  40.     }  
  41. }  


UserServiceTest.java

 

[java] view plain copy 在CODE上查看代碼片 派生到我的代碼片
  1. package org.fei.service;  
  2.   
  3. public class UserServiceTest {  
  4.   
  5.     public static void main(String[] args) {  
  6.         UserService userService = new UserService();  
  7.         userService.addUser("張三", "123");  
  8.     }  
  9. }  


把服務端tomcat啟動,然后執行UserServiceTest.java看到運行結果:


   到這一步,就可以放心把wsdl文件給對方了。

    作為服務端,我們需要把wsdl文件給第三方,並告知我們的訪問地址,如本例訪問地址:http://localhost:8080/cxfwebserviceserver/cxf/userService?wsdl




   例子源碼下載

 CXF代碼生成wsdl,wsdl生成代碼工具下載

原文:http://blog.csdn.net/dream_broken/article/details/35331949

 

附:cxf生成webservice客戶端

使用步驟如下:

一、下載apache cxf的包,如apache-cxf-2.7.10.zip,地址:cxf.apache.org/download.html

二、解壓apache-cxf-2.7.10.zip至某一目錄,如D:\apache-cxf-2.7.10

三、設置環境變量

1、CXF_HOME=D:\apache-cxf-2.7.10

2、在path后面加上 %CXF_HOME%/bin;

在cmd命令中輸入wsdl2java,如果有提示usage,就表明配置成功

四、運行wsdl2java工具

在cmd命令中輸入:wsdl2java -d D:\\src -client http://api.xxx.cn/xxxAPI/service/auditResBatchQueryService?wsdl

(D:\\src 是客戶端程序代碼所在的目錄,http://api.xxx.cn/xxxAPI/service/auditResBatchQueryService?wsdl 是 定義webservice的地址)

附wsdl2java用法:

wsdl2java -p com -d D:\\src -all  xx.wsdl

-p  指定其wsdl的命名空間,也就是要生成代碼的包名:

-d  指定要產生代碼所在目錄

-client 生成客戶端測試web service的代碼

-server 生成服務器啟動web  service的代碼

-impl 生成web service的實現代碼

-ant  生成build.xml文件

-all 生成所有開始端點代碼:types,service proxy,,service interface, server mainline, client mainline, implementation object, and an Ant build.xml file.

實例:

wsdl2java -p com.wz.interfaces.wsclient -d D:\project\src -client d:\ws\serviceInteface.wsdl

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM