最近工作中需要用到webservice,而且結(jié)合spring boot進(jìn)行開發(fā),參照了一些網(wǎng)上的資料,配置過程中出現(xiàn)的了一些問題,于是寫了這篇博客,記錄一下我這次spring boot+cxf開發(fā)的webservice的配置過程,僅供參考。
一、本次開發(fā)除了用到spring boot基礎(chǔ)jar包外,還用到了cxf相關(guān)jar包:
1
2
3
4
5
6
7
8
9
10
11
|
<!-- 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> |
二、首先我們創(chuàng)建一個(gè)實(shí)體類,內(nèi)容是關(guān)于用戶信息的查詢和記錄:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
import java.io.serializable; import java.util.date; public class user implements serializable { private static final long serialversionuid = -5939599230753662529l; private string userid; private string username; private string age; private date updatetime; //getter setter ...... public void setuserid(string userid) { this .userid=userid; } public void setusername(string username) { this .username=username; } public void setage(string age) { this .age=age; } public void setupdatetime(date updatetime) { this .updatetime=updatetime; } public string getuserid() { return userid; } public string getusername() { return username; } public string getage() { return age; } public date getupdatetime() { return updatetime; } } |
三、接下來我們創(chuàng)建接口類:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
import javax.jws.webmethod; import javax.jws.webparam; import javax.jws.webservice; import cn.paybay.demo.entity.user; @webservice public interface userservice { @webmethod string getname( @webparam (name = "userid" ) string userid); @webmethod user getuser(string userid); } |
四、有了接口類,那么接下來我們對(duì)接口進(jìn)行實(shí)現(xiàn),也就是接口實(shí)現(xiàn)類(也就是業(yè)務(wù)類)代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
package cn.paybay.demo.service.impl; import java.util.date; import java.util.hashmap; import java.util.map; import javax.jws.webservice; import cn.paybay.demo.entity.user; import cn.paybay.demo.service.userservice; @webservice (targetnamespace= "http://service.demo.paybay.cn/" ,endpointinterface = "cn.paybay.demo.service.userservice" ) public class userserviceimpl implements userservice{ private map<string, user> usermap = new hashmap<string, user>(); public userserviceimpl() { system.out.println( "向?qū)嶓w類插入數(shù)據(jù)" ); user user = new user(); user.setuserid( "411001" ); user.setusername( "zhansan" ); user.setage( "20" ); user.setupdatetime( new date()); usermap.put(user.getuserid(), user); user = new user(); user.setuserid( "411002" ); user.setusername( "lisi" ); user.setage( "30" ); user.setupdatetime( new date()); usermap.put(user.getuserid(), user); user = new user(); user.setuserid( "411003" ); user.setusername( "wangwu" ); user.setage( "40" ); user.setupdatetime( new date()); usermap.put(user.getuserid(), user); } @override public string getname(string userid) { return "liyd-" + userid; } @override public user getuser(string userid) { system.out.println( "usermap是:" +usermap); return usermap.get(userid); } } |
注釋(ps):在發(fā)布服務(wù)之前,我們要在這里對(duì)業(yè)務(wù)實(shí)現(xiàn)類進(jìn)行一下說明,請(qǐng)大家看下圖箭頭指向的方框部分
下面我來解釋一下加上圖方框箭頭所指代碼的目的:
http://impl.service.demo.paybay.cn/:這是我的業(yè)務(wù)類所在路徑;
http://service.demo.paybay.cn/:這是我的接口類所在路徑;
在不加上圖方框箭頭所指代碼的情況下,你最后發(fā)服務(wù)的結(jié)果是這樣的(如下圖):
并且會(huì)在你進(jìn)行客戶端調(diào)用的時(shí)候回報(bào)錯(cuò):no operation was found with the name {http://impl.service.demo.paybay.cn/}getuser.那么原因就是:在cxf發(fā)布服務(wù)的時(shí)候,發(fā)布的是業(yè)務(wù)類(userserviceimpl.java),那么默認(rèn)的命名空間就會(huì)是業(yè)務(wù)類所在包(路徑),而對(duì)外界暴露的則是接口類(userservice.java),那么對(duì)于客戶端調(diào)用的時(shí)侯,需要按照接口類所在路徑進(jìn)行命名空間的定義。
所以在發(fā)布之前我們要在業(yè)務(wù)類(userserviceimpl.java)上增加注解,指定命名空間,然后再進(jìn)行發(fā)布,
那么我們最終在加上(圖一)方框箭頭所指代碼情況下,發(fā)布服務(wù)的結(jié)果為下圖(請(qǐng)看圖三):
五、(發(fā)布服務(wù))接口類,業(yè)務(wù)類代碼都已經(jīng)準(zhǔn)備好,那么我接下來我就要對(duì)webservice服務(wù)進(jìn)行發(fā)布:
代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
import javax.xml.ws.endpoint; import org.apache.cxf.bus; import org.apache.cxf.bus.spring.springbus; import org.apache.cxf.jaxws.endpointimpl; import org.apache.cxf.transport.servlet.cxfservlet; import org.springframework.boot.web.servlet.servletregistrationbean; import org.springframework.context.annotation.bean; import org.springframework.context.annotation.configuration; import cn.paybay.demo.service.userservice; import cn.paybay.demo.service.impl.userserviceimpl; @configuration public class testconfig { @bean public servletregistrationbean dispatcherservlet() { return new servletregistrationbean( new cxfservlet(), "/test/*" ); } @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; } } |
那么到這里呢,我們的所有的步驟基本完成了,啟動(dòng)spring boot 然后再瀏覽器中輸入url:http://localhost:8080/webservice/test/user?wsdl
可以看到有相關(guān)的wsdl描述信息輸出了,說明服務(wù)已經(jīng)發(fā)布了。
那么這里我又要增加注釋了,請(qǐng)大家注意,我在最初查詢資料,配置demo的時(shí)候,啟動(dòng)以后,發(fā)布時(shí)候總是報(bào)404,網(wǎng)上有很多關(guān)于什么端口沖突等說法,我試過后,根本不是那一回事,然后我無意中嘗試了一下,在url地址處加入工程名,結(jié)果,問題解決了。
因此請(qǐng)大家注意:在測(cè)試發(fā)布服務(wù)的時(shí)候,你在瀏覽器中輸入的url地址應(yīng)該是:http://localhost:8080/你的工程名/test/user?wsdl;
然后就是發(fā)布結(jié)果如下圖(見圖四):
到此為止,我們的服務(wù)發(fā)布成功了。
六、調(diào)用服務(wù)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
import org.apache.cxf.jaxws.endpoint.dynamic.jaxwsdynamicclientfactory; public class client { public static void main(string args[]) throws exception{ jaxwsdynamicclientfactory dcf =jaxwsdynamicclientfactory.newinstance(); org.apache.cxf.endpoint.client client =dcf.createclient( "http://localhost:8080/webservice/test/user?wsdl" ); //getuser 為接口中定義的方法名稱 張三為傳遞的參數(shù) 返回一個(gè)object數(shù)組 object[] objects=client.invoke( "getuser" , "411001" ); //輸出調(diào)用結(jié)果 system.out.println( "*****" +objects[ 0 ].tostring()); } } |
七、最后附上我的工程結(jié)構(gòu)圖(見圖五):
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。
原文鏈接:http://www.cnblogs.com/fuxin41/p/6289162.html