Spring整合CXF提供WebService

說明 (來源於百度百科)

Apache CXF = Celtix + XFire,開始叫 Apache CeltiXfire,後來更名爲 Apache CXF 了,以下簡稱爲 CXF。CXF 繼承了 Celtix 和 XFire 兩大開源項目的精華,提供了對 JAX-WS 全面的支持,並且提供了多種 Binding 、DataBinding、Transport 以及各種 Format 的支持,並且可以根據實際項目的需要,採用代碼優先(Code First)或者 WSDL 優先(WSDL First)來輕鬆地實現 Web Services 的發佈和使用。Apache CXF已經是一個正式的Apache頂級項目。

添加jar包支持

以下是pom文件(直接給出dependencies節點)

    <dependencies>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-frontend-jaxws</artifactId>
            <version>3.1.6</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-transports-http</artifactId>
            <version>3.1.6</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-transports-http-jetty</artifactId>
            <version>3.1.6</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-webapp</artifactId>
        </dependency>
    </dependencies>

服務端

配置說明

  • 配置spring整合CXF提供webService服務
  • 採用jetty啓動服務暴露在指定端口
  • 創建需要暴露服務的接口並實現

操作如下

服務端包如下:
這裏寫圖片描述

HelloWorld.java

import javax.jws.WebService;
@WebService
public interface HelloWorld {
    String sayHi(String text);
}

HelloWorldImpl.java

import javax.jws.WebService;
@WebService(endpointInterface = "demo.spring.service.HelloWorld")//標記提供服務的接口
public class HelloWorldImpl implements HelloWorld {
    public String sayHi(String text) {
        System.out.println("sayHi called");
        return "Hello " + text;
    }
}

Server.java

public class Server {
    protected Server() throws Exception {
        System.out.println("Starting Server");
        org.eclipse.jetty.server.Server server = new org.eclipse.jetty.server.Server(9002);
        WebAppContext webappcontext = new WebAppContext();
        webappcontext.setContextPath("/");
webappcontext.setWar("target/JavaFirstSpringSupport.war");
        HandlerCollection handlers = new HandlerCollection();
        handlers.setHandlers(new Handler[] {webappcontext, new DefaultHandler()});
        server.setHandler(handlers);
        server.start();
        System.out.println("Server ready...");
        server.join();
    }
    //啓動jetty服務器
    public static void main(String args[]) throws Exception {
        new Server();
    }
}

服務端配置文件server.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- START SNIPPET: beans -->
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
    <!-- 提供服務,指定實現類和訪問地址 -->
 <jaxws:endpoint id="helloWorld"    implementor="demo.spring.service.HelloWorldImpl" address="/HelloWorld"/>
</beans>

並且在web.xml配置CXF的攔截器

<servlet>
        <description>Apache CXF Endpoint</description>
        <display-name>cxf</display-name>
        <servlet-name>cxf</servlet-name>
        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
        <servlet-name>cxf</servlet-name>
        <url-pattern>/services/*</url-pattern>
</servlet-mapping>

運行服務端等待

測試是否成功 http://ip:host/services

運行成功能看到一個服務的列表

客戶端

配置說明

  • 需要知道服務端具體暴露的地址和具體的接口
  • 配置CXF工程調用服務,並且使用CXF工廠的create進行生產具體的代理實現類

注意

  1. 服務端和調用端的接口包名要一致
  2. 在客戶端和服務端的接口註解上指定相同的targetNamespace。建議與包名保持一致。

操作如下

客戶端包如下:
這裏寫圖片描述

HelloWorld.java (接口與服務端一致)

import javax.jws.WebService;
@WebService
public interface HelloWorld {
    String sayHi(String text);
}

TestHelloworldClient.java (測試類)

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:webservice-client.xml"})
public  class TestHelloworldClient {
    @Autowired
    private HelloWorld helloWorld; //注入

    @Test
    public void sayHello()throws Exception {
        String response = helloWorld.sayHi("Joe");
        System.out.println("Response: " + response);
        System.exit(0);
    }
}

webservice-client.xml (客戶端)

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schema/jaxws.xsd">
    <!--注意包名必須一致  -->
    <bean id="client" class="demo.spring.service.HelloWorld" factory-bean="clientFactory" factory-method="create"/>
    <bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
        <property name="serviceClass" value="demo.spring.service.HelloWorld"/>
        <!--注意地址能否訪問  -->
         <property name="address" value="http://localhost:9002/services/HelloWorld"/>
    </bean>
</beans>

客戶端運行輸出 Response: Hello Joe

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章