首頁  >  文章  >  Java  >  java整合CXF完成web service開發的實例詳解

java整合CXF完成web service開發的實例詳解

Y2J
Y2J原創
2017-05-12 09:54:511781瀏覽

這篇文章主要介紹了Spring boot 整合CXF開發web service範例,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟著小編過來看看吧

前言

說起web service最近幾年restful大行其道,大有取代傳統soap web service的趨勢,但是一些特有或相對老舊的系統仍然使用了傳統的soap web service,例如銀行、航空公司的機票查詢介面等。

目前就遇到了這種情況,需要在系統中查詢第三方提供的soap web service接口,也就是說要將它整合進現有的系統當中。

spring整合CXF本來十分簡單,但是因為使用了Spring boot,不想用以前xml一堆配置的方式,那麼能否按照Spring boot的風格優雅的進行整合呢?

答案當然是肯定的,但是遍查網路上幾乎沒有這方面的資料,折騰過後覺得還是有必要記錄一下,雖然它顯得非常的簡單。

添加依賴

Maven的項目,首先當然是添加依賴了,除了原先Spring boot的依賴之外,還需要添加cxf依賴:

<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>

寫業務程式碼

這裡我們以查詢使用者資訊為例,建立一個自訂的User物件

public class User implements Serializable {
  private static final long serialVersionUID = -5939599230753662529L;
  private Long       userId;
  private String      username;
  private String      email;
  private Date       gmtCreate;
  //getter setter ......
}

接下來建立一個用於提供web service服務的使用者接口,共兩個方法getNamegetUser,一個傳回普通的String,一個傳回自訂物件:

@WebService
public interface UserService {
  @WebMethod
  String getName(@WebParam(name = "userId") Long userId);
  @WebMethod
  User getUser(Long userId);
}

有介面當然要有業務代碼實現了,這裡我們只做簡單的演示:

public class UserServiceImpl implements UserService {
  private Map<Long, User> userMap = new HashMap<Long, User>();
  public UserServiceImpl() {
    User user = new User();
    user.setUserId(10001L);
    user.setUsername("liyd1");
    user.setEmail("liyd1@qq.com");
    user.setGmtCreate(new Date());
    userMap.put(user.getUserId(), user);
    user = new User();
    user.setUserId(10002L);
    user.setUsername("liyd2");
    user.setEmail("liyd2@qq.com");
    user.setGmtCreate(new Date());
    userMap.put(user.getUserId(), user);
    user = new User();
    user.setUserId(10003L);
    user.setUsername("liyd3");
    user.setEmail("liyd3@qq.com");
    user.setGmtCreate(new Date());
    userMap.put(user.getUserId(), user);
  }
  @Override
  public String getName(Long userId) {
    return "liyd-" + userId;
  }
  @Override
  public User getUser(Long userId) {
    return userMap.get(userId);
  }
}

發布服務

接口和業務代碼我們都寫完了,剩下下的就是發布服務了,也就是Spring boot和cxf的整合。

其實這二者的整合十分的簡單,比以前xml的方式更加的簡潔,所有相關的程式碼如下:

@Configuration
public class CxfConfig {
  @Bean
  public ServletRegistrationBean dispatcherServlet() {
    return new ServletRegistrationBean(new CXFServlet(), "/soap/*");
  }
  @Bean(name = Bus.DEFAULT_BUS_ID)
  public SpringBus springBus() {
    return new SpringBus();
  }
  @Bean
  public UserService userService() {
    return new UserServiceImpl();
  }
  @Bean
  public Endpoint endpoint() {
    EndpointImpl endpoint = new EndpointImpl(springBus(), userService());
    endpoint.publish("/user");
    return endpoint;
  }
}

可以看到從配置cxf到發布服務,都只需要一二行程式碼,出乎意料的簡單吧?

到這裡我們所有的操作就都完成了,啟動Spring boot,訪問localhost:8080/soap/user?wsdl

可以看到有相關的wsdl描述訊息輸出了,說明服務已經發布了。

呼叫服務

發佈了web service服務,那怎麼呼叫呢,像整合一些第三方介面也是先有呼叫才後有發布啊?

呼叫soap web service,一般的方法是根據wsdl產生客戶端程式碼,整合之後就可以像呼叫本地介面一樣使用了。

但是我個人不太喜歡這種方式,每個介面都要產生一次還有一堆的程式碼,感覺比較麻煩。

相對更喜歡傳入方法名稱呼叫的方式,顯得清爽而簡潔,以下就是所有程式碼了:

JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
Client client = dcf.createClient("http://localhost:8080/soap/user?wsdl");
Object[] objects = client.invoke("getUser", 10002L);
//输出调用结果
System.out.println(objects[0].getClass());
System.out.println(objects[0].toString());

這種方式要注意的就是,如果呼叫的服務介面回傳的是一個自訂對象,那麼結果Object[]中的資料型別就成了這個自訂對象(元件幫你自動產生了這個對象),

但是你本機可能並沒有這個類,所以需要自行轉換處理,最簡單的是新建一個跟返回結果一模一樣的類進行強轉,當然更好的方式是封裝一個通用的,這個不是本文主題就不在這深入討論了。

【相關推薦】

1. Java免費影片教學

#2. JAVA教學手冊

3. 全面解析Java註解

#

以上是java整合CXF完成web service開發的實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn