欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring boot 整合CXF開發(fā)web service示例

 更新時(shí)間:2017年05月02日 16:40:15   作者:Joker_Ye  
這篇文章主要介紹了Spring boot 整合CXF開發(fā)web service示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

前言

說起web service最近幾年restful大行其道,大有取代傳統(tǒng)soap web service的趨勢(shì),但是一些特有或相對(duì)老舊的系統(tǒng)依然使用了傳統(tǒng)的soap web service,例如銀行、航空公司的機(jī)票查詢接口等。

目前就遇到了這種情況,需要在系統(tǒng)中查詢第三方提供的soap web service接口,也就是說要將它整合進(jìn)現(xiàn)有的系統(tǒng)當(dāng)中。

spring整合CXF本來十分簡(jiǎn)單,但是因?yàn)槭褂昧薙pring boot,不想用以前xml一堆配置的方式,那么能否按照Spring boot的風(fēng)格優(yōu)雅的進(jìn)行整合呢?

答案當(dāng)然是肯定的,但是遍查網(wǎng)上幾乎沒有這方面的資料,折騰過后覺得還是有必要記錄一下,雖然它顯得非常的簡(jiǎn)單。

添加依賴

Maven的項(xiàng)目,首先當(dāng)然是添加依賴了,除了原先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>

編寫業(yè)務(wù)代碼

這里我們以查詢用戶信息為例,創(chuàng)建一個(gè)自定義的User對(duì)象:

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

接下來創(chuàng)建一個(gè)用于提供web service服務(wù)的用戶接口,共兩個(gè)方法getNamegetUser,一個(gè)返回普通的String,一個(gè)返回自定義對(duì)象:

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

有接口當(dāng)然要有業(yè)務(wù)代碼實(shí)現(xiàn)了,這里我們只做簡(jiǎn)單的演示:

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);
  }
}

發(fā)布服務(wù)

接口和業(yè)務(wù)代碼我們都寫完了,剩下的就是發(fā)布服務(wù)了,也就是Spring boot和cxf的整合。

其實(shí)這二者的整合十分的簡(jiǎn)單,比以前xml的方式更加的簡(jiǎn)潔,所有相關(guān)的代碼如下:

@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到發(fā)布服務(wù),都只需要一二行代碼,出乎意料的簡(jiǎn)單吧?

到這里我們所有的操作就都完成了,啟動(dòng)Spring boot,訪問 http://localhost:8080/soap/user?wsdl

可以看到有相關(guān)的wsdl描述信息輸出了,說明服務(wù)已經(jīng)發(fā)布了。

調(diào)用服務(wù)

發(fā)布了web service服務(wù),那怎么調(diào)用呢,像整合一些第三方接口也是先有調(diào)用才后有發(fā)布?。?/p>

調(diào)用soap web service,一般的方法是根據(jù)wsdl生成客戶端代碼,整合之后就可以像調(diào)用本地接口一樣使用了。

但是我個(gè)人不怎么喜歡這種方式,每個(gè)接口都要生成一次還有一堆的代碼,感覺比較麻煩。

相對(duì)更喜歡傳入方法名調(diào)用的方式,顯得清爽而簡(jiǎn)潔,以下就是所有代碼了:

JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
Client client = dcf.createClient("http://localhost:8080/soap/user?wsdl");
Object[] objects = client.invoke("getUser", 10002L);
//輸出調(diào)用結(jié)果
System.out.println(objects[0].getClass());
System.out.println(objects[0].toString());

這種方式要注意的就是,如果調(diào)用的服務(wù)接口返回的是一個(gè)自定義對(duì)象,那么結(jié)果Object[]中的數(shù)據(jù)類型就成了這個(gè)自定義對(duì)象(組件幫你自動(dòng)生成了這個(gè)對(duì)象),

但是你本地可能并沒有這個(gè)類,所以需要自行轉(zhuǎn)換處理,最簡(jiǎn)單的是新建一個(gè)跟返回結(jié)果一模一樣的類進(jìn)行強(qiáng)轉(zhuǎn),當(dāng)然更好的方式是封裝一個(gè)通用的,這個(gè)不是本文主題就不在這深入討論了。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • struts1登錄示例代碼_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    struts1登錄示例代碼_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要介紹了struts1登錄示例代碼,需要的朋友可以參考下
    2017-08-08
  • Spring?+?ECharts實(shí)現(xiàn)數(shù)據(jù)可視化的案例詳解

    Spring?+?ECharts實(shí)現(xiàn)數(shù)據(jù)可視化的案例詳解

    Apache?ECharts是一個(gè)基于?JavaScript?的開源可視化圖表庫,在網(wǎng)頁上實(shí)現(xiàn)數(shù)據(jù)的可視化,非常好用,本文將通過一個(gè)簡(jiǎn)單的demo來給大家介紹一下Spring?+?ECharts如何數(shù)據(jù)可視化,需要的朋友可以參考下
    2023-07-07
  • IDEA設(shè)置maven修改settings.xml配置文件無法加載倉庫的解決方案

    IDEA設(shè)置maven修改settings.xml配置文件無法加載倉庫的解決方案

    這篇文章主要介紹了IDEA設(shè)置maven修改settings.xml配置文件無法加載倉庫的解決方案,幫助大家更好的利用IDEA進(jìn)行JAVA的開發(fā)學(xué)習(xí),感興趣的朋友可以了解下
    2021-01-01
  • Java設(shè)計(jì)模式之單例模式Singleton Pattern詳解

    Java設(shè)計(jì)模式之單例模式Singleton Pattern詳解

    這篇文章主要介紹了Java設(shè)計(jì)模式之單例模式Singleton Pattern詳解,一些常用的工具類、線程池、緩存,數(shù)據(jù)庫,數(shù)據(jù)庫連接池、賬戶登錄系統(tǒng)、配置文件等程序中可能只允許我們創(chuàng)建一個(gè)對(duì)象,這就需要單例模式,需要的朋友可以參考下
    2023-12-12
  • java中addMouseListener()方法的使用

    java中addMouseListener()方法的使用

    這篇文章主要介紹了java中addMouseListener()方法的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java詳細(xì)解析==和equals的區(qū)別

    Java詳細(xì)解析==和equals的區(qū)別

    這篇文章主要介紹了Java中==和equals()的區(qū)別,,==可以使用在基本數(shù)據(jù)類型變量和引用數(shù)據(jù)類型變量中,equals()是方法,只能用于引用數(shù)據(jù)類型,需要的朋友可以參考下
    2022-04-04
  • maven無法依賴spring-cloud-stater-zipkin的解決方案

    maven無法依賴spring-cloud-stater-zipkin的解決方案

    這篇文章主要介紹了maven無法依賴spring-cloud-stater-zipkin如何解決,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-05-05
  • Java線程的控制詳解

    Java線程的控制詳解

    這篇文章主要介紹了Java中的join線程、后臺(tái)線程、線程睡眠、線程讓步以及線程的優(yōu)先級(jí),非常的詳細(xì),希望能對(duì)大家有所幫助
    2014-10-10
  • java實(shí)現(xiàn)查找文本內(nèi)容替換功能示例

    java實(shí)現(xiàn)查找文本內(nèi)容替換功能示例

    文本替換幾乎是所有文本編輯器都支持的功能,但是要限制在編輯其中才可以執(zhí)行該功能。本實(shí)例實(shí)現(xiàn)了制定文本文件的內(nèi)容替換,并且不需要再編輯其中打開文本文件
    2014-02-02
  • Java如何搭建一個(gè)個(gè)人網(wǎng)盤

    Java如何搭建一個(gè)個(gè)人網(wǎng)盤

    這篇文章主要介紹了Java如何搭建一個(gè)個(gè)人網(wǎng)盤,對(duì)網(wǎng)盤感興趣的讀者,可以參考一下
    2021-04-04

最新評(píng)論