[翻譯]CXF用戶指南:一個簡單的JAX-WS服務

轉自:http://www.iteye.com/topic/745233

 原文地址:http://cxf.apache.org/docs/a-simple-jax-ws-service.html

這個例子將通過編寫JAX-WS來引導你開發第一個服務

  1. 設置構建
  2. 編寫服務
  3. 發佈服務
  4. 訪問服務
同樣在CXF發佈包中的也可以找到hello_world_code_first示例,注意:這個示例只有在CXF 2.0.1+的版本中!

設置構建

如果你使用Maven來構建你的工程,查看這個頁面
否則,打開你最喜愛的IDE,然後創建一個新的工程,我們首先要做的是將CXF依賴的包添加到工程裏,你可以在CXF的發佈包的ib目錄下找到這些依賴包(提示:如果發佈包的版本改變,這些jar包上的版本數字可能有所不同)
引用
commons-logging-1.1.1.jar
geronimo-activation_1.1_spec-1.0.2.jar (or Sun's Activation jar)
geronimo-annotation_1.0_spec-1.1.1.jar (JSR 250)
geronimo-javamail_1.4_spec-1.6.jar (or Sun's JavaMail jar)
geronimo-servlet_2.5_spec-1.2.jar (or Sun's Servlet jar)
geronimo-ws-metadata_2.0_spec-1.1.2.jar (JSR 181)
geronimo-jaxws_2.1_spec-1.0.jar (or Sun's jaxws-api-2.1.jar)
geronimo-stax-api_1.0_spec-1.0.1.jar (or other stax-api jar)
jaxb-api-2.1.jar
jaxb-impl-2.1.12.jar
jetty-6.1.21.jar
jetty-util-6.1.21.jar
neethi-2.0.4.jar
saaj-api-1.3.jar
saaj-impl-1.3.2.jar
wsdl4j-1.6.2.jar
wstx-asl-3.2.8.jar
XmlSchema-1.4.5.jar
xml-resolver-1.2.jar

Spring依賴包 (非必須- 爲了支持XML配置):
引用
aopalliance-1.0.jar
spring-core-2.5.5.jar
spring-beans-2.5.5.jar
spring-context-2.5.5.jar
spring-web-2.5.5.jar

還需要CXF的jar包:
引用
cxf-2.2.3.jar

編寫服務

首先,我們將編寫服務的接口,這個接口只有一個"sayHello" 的方法,這個方法會對提交他們名字的用戶說 "Hello"
Java代碼 複製代碼 收藏代碼
  1. @WebService  
  2. public interface HelloWorld {   
  3.   
  4.     String sayHi(String text);   
  5.   
  6.     /* 進階應用,JAX-WS/JAXB不支持自定義類型參數如User  
  7.      * 需要編寫XmlAdapter類來處理自定義類型  
  8.      */  
  9.     String sayHiToUser(User user);   
  10.   
  11.     /* Map傳遞  
  12.      * JAXB同樣也不支持Maps.處理Lists很輕鬆,但是不直接支持Maps  
  13.      * 同樣也需要使用XmlAdapter來映射maps到JAXB能處理的beans  
  14.      */  
  15.     @XmlJavaTypeAdapter(IntegerUserMapAdapter.class)   
  16.     Map<Integer, User> getUsers();   
  17. }  
@WebService
public interface HelloWorld {

    String sayHi(String text);

    /* 進階應用,JAX-WS/JAXB不支持自定義類型參數如User
     * 需要編寫XmlAdapter類來處理自定義類型
     */
    String sayHiToUser(User user);

    /* Map傳遞
     * JAXB同樣也不支持Maps.處理Lists很輕鬆,但是不直接支持Maps
     * 同樣也需要使用XmlAdapter來映射maps到JAXB能處理的beans
     */
    @XmlJavaTypeAdapter(IntegerUserMapAdapter.class)
    Map<Integer, User> getUsers();
}
爲了確認參數在xml文件中名稱正確,你需要使用:
Java代碼 複製代碼 收藏代碼
  1. @WebService  
  2. public interface HelloWorld {   
  3.     String sayHi(@WebParam(name="text") String text);   
  4. }  
@WebService
public interface HelloWorld {
    String sayHi(@WebParam(name="text") String text);
}
因爲java接口在.class文件中不存儲參數名稱,所以@WebParam註解是必須的,因此如果你不使用這個註解,參數將被命名爲arg0

我們的實現將像這樣:
Java代碼 複製代碼 收藏代碼
  1. package demo.hw.server;   
  2.   
  3. import java.util.LinkedHashMap;   
  4. import java.util.Map;   
  5.   
  6. import javax.jws.WebService;   
  7.   
  8. @WebService(endpointInterface = "demo.hw.server.HelloWorld",   
  9.             serviceName = "HelloWorld")   
  10. public class HelloWorldImpl implements HelloWorld {   
  11.     Map<Integer, User> users = new LinkedHashMap<Integer, User>();   
  12.   
  13.     public String sayHi(String text) {   
  14.         System.out.println("sayHi called");   
  15.         return "Hello " + text;   
  16.     }   
  17.   
  18.     public String sayHiToUser(User user) {   
  19.         System.out.println("sayHiToUser called");   
  20.         users.put(users.size() + 1, user);   
  21.         return "Hello "  + user.getName();   
  22.     }   
  23.   
  24.     public Map<Integer, User> getUsers() {   
  25.         System.out.println("getUsers called");   
  26.         return users;   
  27.     }   
  28.   
  29. }  
package demo.hw.server;

import java.util.LinkedHashMap;
import java.util.Map;

import javax.jws.WebService;

@WebService(endpointInterface = "demo.hw.server.HelloWorld",
            serviceName = "HelloWorld")
public class HelloWorldImpl implements HelloWorld {
    Map<Integer, User> users = new LinkedHashMap<Integer, User>();

    public String sayHi(String text) {
        System.out.println("sayHi called");
        return "Hello " + text;
    }

    public String sayHiToUser(User user) {
        System.out.println("sayHiToUser called");
        users.put(users.size() + 1, user);
        return "Hello "  + user.getName();
    }

    public Map<Integer, User> getUsers() {
        System.out.println("getUsers called");
        return users;
    }

}
在實現類上的@WebService註解使CXF知道使用那個接口來創建WSDL,我們示例中是HelloWorld接口

發佈服務
Java代碼 複製代碼 收藏代碼
  1. System.out.println("Starting Server");   
  2. HelloWorldImpl implementor = new HelloWorldImpl();   
  3. String address = "http://localhost:9000/helloWorld";   
  4. Endpoint.publish(address, implementor);  
System.out.println("Starting Server");
HelloWorldImpl implementor = new HelloWorldImpl();
String address = "http://localhost:9000/helloWorld";
Endpoint.publish(address, implementor);
完整的代碼在http://svn.apache.org/repos/asf/cxf/trunk/distribution/src/main/release/samples/java_first_jaxws/src/demo/hw/server/Server.java

或者你可以使用下列代碼,通過如下代碼,你可以更多控制行爲,例如你可以添加日誌攔截器
Java代碼 複製代碼 收藏代碼
  1. HelloWorldImpl implementor = new HelloWorldImpl();   
  2. JaxWsServerFactoryBean svrFactory = new JaxWsServerFactoryBean();   
  3. svrFactory.setServiceClass(HelloWorld.class);   
  4. svrFactory.setAddress("http://localhost:9000/helloWorld");   
  5. svrFactory.setServiceBean(implementor);   
  6. svrFactory.getInInterceptors().add(new LoggingInInterceptor());   
  7. svrFactory.getOutInterceptors().add(new LoggingOutInterceptor());   
  8. svrFactory.create();  
HelloWorldImpl implementor = new HelloWorldImpl();
JaxWsServerFactoryBean svrFactory = new JaxWsServerFactoryBean();
svrFactory.setServiceClass(HelloWorld.class);
svrFactory.setAddress("http://localhost:9000/helloWorld");
svrFactory.setServiceBean(implementor);
svrFactory.getInInterceptors().add(new LoggingInInterceptor());
svrFactory.getOutInterceptors().add(new LoggingOutInterceptor());
svrFactory.create();
你可以忽略設置ServiceClass,但是最好設置,這樣可以使服務端和客戶端都從同樣的接口創建而來,如果你使用實現類來作爲替代可能會出現問題

瀏覽器裏輸入http://localhost:9000/helloWorld?wsdl顯示出這個服務的wsdl

訪問服務

同樣客戶端代碼在http://svn.apache.org/repos/asf/cxf/trunk/distribution/src/main/release/samples/java_first_jaxws/src/demo/hw/client/Client.java

對於客戶端,同樣也有替代方法給予你更多的伸縮性,當然如上一個示例的日誌攔截器也是可選擇的,但是對於初學者幫助很大:
Java代碼 複製代碼 收藏代碼
  1. JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();   
  2. factory.getInInterceptors().add(new LoggingInInterceptor());   
  3. factory.getOutInterceptors().add(new LoggingOutInterceptor());   
  4. factory.setServiceClass(HelloWorld.class);   
  5. factory.setAddress("http://localhost:9000/helloWorld");   
  6. HelloWorld client = (HelloWorld) factory.create();   
  7.   
  8. String reply = client.sayHi("HI");   
  9. System.out.println("Server said: " + reply);   
  10. System.exit(0);   
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.getInInterceptors().add(new LoggingInInterceptor());
factory.getOutInterceptors().add(new LoggingOutInterceptor());
factory.setServiceClass(HelloWorld.class);
factory.setAddress("http://localhost:9000/helloWorld");
HelloWorld client = (HelloWorld) factory.create();

String reply = client.sayHi("HI");
System.out.println("Server said: " + reply);
System.exit(0); 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章