這篇文章主要介紹了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服務的使用者接口,共兩個方法getName
和getUser
,一個傳回普通的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中文網其他相關文章!