CXF發布webService服務以及客戶端調用


這篇隨筆內容是CXF發布webService服務以及客戶端調用的方法

CXF是什么?

開發工作之前需要下載CXF和安裝

下載地址:http://cxf.apache.org

安裝過程:

<1>下載解壓到一個目錄(不能有中文,特殊字符)

<2>配置環境變量(我使用的是2.6.15版本,針對不同的版本配置環境變量)

CXF_HOME=D:\DevIDE\Java\apache-cxf-2.6.15

path=%CXF_HOME%/bin;

<3>測試是否安裝成功?

 

CXF安裝好了,就可以進行webService的開發工作,不管用什么技術,盡量可以先參考官方文檔

在cxf解壓目錄中有samples目錄,都是參考例子

 

我們可以通過java工程來發布一個webService服務,也可以通過web工程發布一個webService服務,下面分別寫一個Demo

通過java工程發布一個webService

1、創建一個java工程

2、導入jar包

將目錄中的jar都引入到工程即可。(注意一個目錄和一個which_jar不要拷貝進去)

 3、寫webservice接口類

1 package com.esb.ws.server;
2 
3 import javax.jws.WebService;
4 
5 @WebService
6 public interface MobileAddress {
7     public String getAddressByMobile(String mobile);
8 }

4、寫一個sei,服務接口實現類

1 package com.esb.ws.server;
2 
3 public class MobileAddressImpl implements MobileAddress {
4 
5     @Override
6     public String getAddressByMobile(String mobile) {
7         return "電話號碼"+mobile+"屬於上海電信";
8     }
9 }

5、發布服務

 1 package com.esb.ws.server;
 2 
 3 import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
 4 
 5 public class CXFServer {
 6     public static void main(String[] args) {
 7         //三步走
 8         //1、實例化一個jaxws服務工廠
 9         JaxWsServerFactoryBean sf = new JaxWsServerFactoryBean();
10         
11         //設置三個屬性
12         //2.1設置SEI接口的class
13         sf.setServiceClass(MobileAddress.class);
14         //2.2設置SEI的實現者
15         sf.setServiceBean(new MobileAddressImpl());
16         //2.3服務地址
17         sf.setAddress("http://127.0.0.1:8888/mobileService");
18         
19         //3創建並發布
20         sf.create();
21         
22         System.out.println("通過CXF創建服務成功!");
23     }
24 }

 

測試的話可以通過訪問http://127.0.0.1:8888/mobileService?wsdl

客戶端程序開發

<1>生成樁,本地代理接口類(在dos窗口通過wsdl2java命令,具體的命令網上找)

將生成的類復制到工程中

 

2、編寫客戶端調用webservice服務

 1 package com.esb.ws.client;
 2 
 3 import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
 4 
 5 import com.esb.ws.server.MobileAddress;
 6 
 7 public class CXFClient {
 8     public static void main(String[] args) {
 9         //三部走
10         //1、本地代理工廠實例
11         JaxWsProxyFactoryBean pf = new JaxWsProxyFactoryBean();
12         
13         //2、設置webservice服務端的地址,加上wsdl也可以
14         pf.setAddress("http://127.0.0.1:8888/mobileService");
15         
16         //3、創建的到本地代理類(樁)
17         MobileAddress address = pf.create(MobileAddress.class);
18         
19         String result = address.getAddressByMobile("181xxxx7433");
20         
21         System.out.println(result);
22     }
23 }

打印結果:

 

通過web發布webService

Web服務發布webService,是將webservice服務和普通的web服務一起啟動,也就是說使用tomcat啟動webservice服務,而不是通過main方法。這里介紹的是CXF與Spring整合,使用web容器啟動,然后spring容器起來,spring容器管理者webservice服務類

官方Demo,參考sample目錄下的java_first_spring_support

webService服務端開發:

<1>新建web工程

<2>導入jar包

Spring的核心包+CXF相關和依賴

在CXF安裝包解壓目錄下的lib目錄下的jar包全部導入即可,需要注意的是:如果你的項目用的新版本,那么這里的spring的包就別拷貝了

<3>接口類,並在接口類加上注解

 1 package com.esb.ws.server;
 2 
 3 import javax.jws.WebMethod;
 4 import javax.jws.WebParam;
 5 import javax.jws.WebResult;
 6 import javax.jws.WebService;
 7 import javax.xml.ws.BindingType;
 8 
 9 @WebService(name="MobileAddress"
10             ,serviceName="MobileAddressService"
11             ,portName="MobileAddressPort"
12             ,targetNamespace="http://ws.esb.com/"
13            )
14 @BindingType(javax.xml.ws.soap.SOAPBinding.SOAP12HTTP_BINDING)
15 public interface MobileAddress {
16     
17     @WebMethod(operationName="getAddressbyMobileNo")
18     public @WebResult(name="address")String getAddressByMobile(@WebParam(name="mobileNo")String mobile);
19 }

<4>接口實現類

 1 package com.esb.ws.server;
 2 
 3 public class MobileAddressImpl implements MobileAddress {
 4 
 5     @Override
 6     public String getAddressByMobile(String mobile) {
 7         return "電話號碼"+mobile+"屬於上海電信";
 8     }
 9 
10 }

<5>配置web.xml文件,目的就是為了web容器啟動時,初始化CXF服務,是web服務發布webService的連接點。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>WebService_CXF_Web</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  <servlet>
      <servlet-name>cxf</servlet-name>
      <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
  </servlet>
  <servlet-mapping>
      <servlet-name>cxf</servlet-name>
      <url-pattern>/ws/*</url-pattern>
  </servlet-mapping>
</web-app>

<6>配置CXF服務端的配置文件

分析源代碼可以得出默認情況下,加載/WEB-INF/cxf-servlet.xml

配置cxf-servlet.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws"
    xmlns:soap="http://cxf.apache.org/bindings/soap" xmlns:jaxrs="http://cxf.apache.org/jaxrs"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
                        http://www.springframework.org/schema/beans/spring-beans.xsd
                        http://cxf.apache.org/bindings/soap 
                        http://cxf.apache.org/schemas/configuration/soap.xsd
                        http://cxf.apache.org/jaxws 
                        http://cxf.apache.org/schemas/jaxws.xsd
                        http://cxf.apache.org/jaxrs 
                        http://cxf.apache.org/schemas/jaxrs.xsd
                        ">
    <!-- 
        jaxws:server代表org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean,服務實例工廠
        等價於JaxWsServiceFactoryBean jf = new JaxWsServiceFactoryBean();
        address:寫服務的相對路徑
        serviceClass:sei接口類
        jaxws:serviceBean:sei的實現類
     -->
    <jaxws:server address="/mobile" serviceClass="com.esb.ws.server.MobileAddress">
        <jaxws:serviceBean>
            <ref bean="mobileAddress"/>
        </jaxws:serviceBean>
    </jaxws:server>
    <bean id="mobileAddress" class="com.esb.ws.server.MobileAddressImpl"></bean>
</beans>

<7>發布服務,啟動tomcat

測試OK?

瀏覽器訪問 http://localhost:8080/WebService_CXF_Web/ws/mobile?wsdl(自己發布的地址)

 

開發客戶端調用webService

<1>生成樁,獲取接口代理類

拷貝生成的類到客戶端工程

 

2、配置客戶端的bean

配置文件:

 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" xmlns:jaxws="http://cxf.apache.org/jaxws"
 4     xmlns:soap="http://cxf.apache.org/bindings/soap" xmlns:jaxrs="http://cxf.apache.org/jaxrs"
 5     xsi:schemaLocation="http://www.springframework.org/schema/beans 
 6     http://www.springframework.org/schema/beans/spring-beans.xsd
 7     http://cxf.apache.org/bindings/soap 
 8     http://cxf.apache.org/schemas/configuration/soap.xsd
 9     http://cxf.apache.org/jaxws 
10     http://cxf.apache.org/schemas/jaxws.xsd
11     http://cxf.apache.org/jaxrs 
12     http://cxf.apache.org/schemas/jaxrs.xsd
13     ">
14     <jaxws:client id="mobileAddress" address="http://localhost:8080/WebService_CXF_Web/ws/mobile" serviceClass="com.esb.ws.stub.MobileAddress">
15         
16     </jaxws:client>
17 </beans>

<3>客戶端調用webService

 1 package com.esb.ws.client;
 2 
 3 import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
 4 import org.junit.Test;
 5 import org.springframework.context.ApplicationContext;
 6 import org.springframework.context.support.ClassPathXmlApplicationContext;
 7 
 8 import com.esb.ws.stub.MobileAddress;
 9 
10 public class WebServiceCXFClient {
11     @Test
12     public void wsCXFTest(){
13         ApplicationContext context = new ClassPathXmlApplicationContext("client-beans.xml");
14         MobileAddress mobileAddress = (MobileAddress)context.getBean("mobileAddress");
15         String result = mobileAddress.getAddressbyMobileNo("181xxxx7433");
16         
17         System.out.println(result);
18     }
19     
20 }

 當然也可以使用和前面一樣的方法(不使用spring獲取服務接口代理類)調用webService

package com.esb.ws.client;

import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.esb.ws.stub.MobileAddress;

public class WebServiceCXFClient {

    @Test
    public void wdCXFTest2(){
        JaxWsProxyFactoryBean ps = new JaxWsProxyFactoryBean();
        
        ps.setAddress("http://localhost:8080/WebService_CXF_Web/ws/mobile");
        ps.setServiceClass(MobileAddress.class);
        
        MobileAddress mobileAddress = (MobileAddress)ps.create();
        
        String result = mobileAddress.getAddressbyMobileNo("181xxxx7433");
        System.out.println(result);
    }
}

簡單的Demo就是這些了。

 

jax-ws也可以開發webService,為什么使用CXF

jax-ws的優點,就是jdk自帶的,速度較快,但是開發麻煩,比如一些日志功能,web集成功能,以及與spring集成稍微麻煩

CXF可以解決,整合日志攔截器、天生和spring是整合的、還整合了其他一些功能。

 

作為一個java小白,寫寫隨筆,整理下知識點,積累下知識點。

 


免責聲明!

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



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