最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

前言

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

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

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

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

添加依賴

Maven的項目,首先當(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)建一個自定義的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 ......
}

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

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

有接口當(dāng)然要有業(yè)務(wù)代碼實現(xià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的整合。

其實這二者的整合十分的簡單,比以前xml的方式更加的簡潔,所有相關(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ù),都只需要一二行代碼,出乎意料的簡單吧?

到這里我們所有的操作就都完成了,啟動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ā)布???

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

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

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

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ù)接口返回的是一個自定義對象,那么結(jié)果Object[]中的數(shù)據(jù)類型就成了這個自定義對象(組件幫你自動生成了這個對象),

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

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

相關(guān)文章

  • 解決Mybatis報錯:org.apache.ibatis.reflection.ReflectionException: There is no getter for property named問題

    解決Mybatis報錯:org.apache.ibatis.reflection.ReflectionException

    文章主要討論了在使用MyBatis進行數(shù)據(jù)庫操作時遇到的幾個常見問題及其解決方法,首先,文章指出如果DTO類中沒有定義getter和setter方法,會導(dǎo)致反射異常,解決方法是使用Lombok的@Data注解自動生成這些方法
    2025-01-01
  • 詳解Java如何使用責(zé)任鏈默認優(yōu)雅地進行參數(shù)校驗

    詳解Java如何使用責(zé)任鏈默認優(yōu)雅地進行參數(shù)校驗

    項目中參數(shù)校驗十分重要,它可以保護我們應(yīng)用程序的安全性和合法性。這篇文章主要介紹了如何使用責(zé)任鏈默認優(yōu)雅地進行參數(shù)校驗,需要的可以參考一下
    2023-03-03
  • java基礎(chǔ)(System.err和System.out)詳解

    java基礎(chǔ)(System.err和System.out)詳解

    下面小編就為大家?guī)硪黄猨ava基礎(chǔ)(System.err和System.out)詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • GC調(diào)優(yōu)實戰(zhàn)之高分配速率High?Allocation?Rate

    GC調(diào)優(yōu)實戰(zhàn)之高分配速率High?Allocation?Rate

    這篇文章主要為大家介紹了GC調(diào)優(yōu)之高分配速率High?Allocation?Rate的實戰(zhàn)示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-01-01
  • springboot項目中統(tǒng)一時間格式處理方法

    springboot項目中統(tǒng)一時間格式處理方法

    JacksonConfiguration主要用于配置JSON的序列化和反序列化,而LocalDateTimeFormatter則用于處理請求和響應(yīng)中的LocalDateTime格式,這兩個配置項在SpringBoot項目中至關(guān)重要,確保數(shù)據(jù)格式的正確處理和傳輸
    2024-10-10
  • Java 十大排序算法之堆排序刨析

    Java 十大排序算法之堆排序刨析

    堆排序是利用堆這種數(shù)據(jù)結(jié)構(gòu)而設(shè)計的一種排序算法,堆排序是一種選擇排序,它的最壞,最好,平均時間復(fù)雜度均為O(nlogn),它也是不穩(wěn)定排序。首先簡單了解下堆結(jié)構(gòu)
    2021-11-11
  • SpringCloud將Nacos作為配置中心實現(xiàn)流程詳解

    SpringCloud將Nacos作為配置中心實現(xiàn)流程詳解

    這篇文章主要介紹了Springcloud中的Nacos Config服務(wù)配置,本文以用戶微服務(wù)為例,進行統(tǒng)一的配置,結(jié)合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2022-10-10
  • 詳解SpringBoot+Lucene案例介紹

    詳解SpringBoot+Lucene案例介紹

    這篇文章主要介紹了詳解SpringBoot+Lucene案例介紹,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • java對象list使用stream根據(jù)某一個屬性轉(zhuǎn)換成map的3種方式舉例

    java對象list使用stream根據(jù)某一個屬性轉(zhuǎn)換成map的3種方式舉例

    開發(fā)小伙伴們通常會需要使用到對象和Map互相轉(zhuǎn)換的開發(fā)場景,下面這篇文章主要給大家介紹了關(guān)于java對象list使用stream根據(jù)某一個屬性轉(zhuǎn)換成map的3種方式,需要的朋友可以參考下
    2024-01-01
  • @KafkaListener 如何使用

    @KafkaListener 如何使用

    這篇文章主要介紹了@KafkaListener 如何使用,本文通過圖文實例代碼相結(jié)合給大家詳細講解,文末給大家介紹了kafka的消費者分區(qū)分配策略,需要的朋友可以參考下
    2023-02-02

最新評論

沽源县| 南涧| 凤城市| 文登市| 冀州市| 铁岭市| 福海县| 九江市| 余干县| 仁化县| 原阳县| 全南县| 治多县| 南昌县| 建昌县| 绩溪县| 兴隆县| 寿宁县| 明水县| 瑞金市| 沂源县| 蓬溪县| 湘阴县| 紫金县| 崇义县| 方正县| 县级市| 会昌县| 达拉特旗| 汉寿县| 湖口县| 永春县| 正蓝旗| 泽库县| 磐安县| 沧源| 延川县| 西昌市| 玉山县| 玛纳斯县| 武威市|