Apache CXF提供方便的Spring整合方法,可以通過(guò)注解、Spring標(biāo)簽式配置來(lái)暴露Web Services和消費(fèi)Web Services。
@WebService和@WebMethod是WSDL映射Annotation.這些Annotation將描述Web Service的WSDL文檔元素和JAVA源代碼聯(lián)系在一起。@SOAPBinding是一個(gè)綁定的annotation,用來(lái)說(shuō)明網(wǎng)絡(luò)協(xié)議和格式
1、@WebService annotation的元素name,serviceName和targetNamespace成員用來(lái)描述wsdl:protType,wsdl:service,和targetNameSpace生成WebService中的WSDL文件。
2、@SOAPBinding是一個(gè)用來(lái)描述SOAP格式和RPC的協(xié)議的綁定Annotation.
3、@WebMethod Annotation的operationName成員描述了wsdl:operation,而且它的操作描述了WSDL文件中的SOAPAction頭部,這是客戶端必須要放入到SOAPHeader中的數(shù)值,SOAP1.1中的一種約束。
4、@WebParam Annotation的partName成員描述了WSDL文檔中的wsdl:part.
5、@WebResult Annotation的partName成員描述了wsdl:part用來(lái)返回WSDL文檔的值。
接下來(lái)通過(guò)一個(gè)實(shí)例來(lái)講解CXF的使用方法。
首先請(qǐng)下載最新版本的CXF下載地址是http://cxf.apache.org/
下載好了cxf后請(qǐng)?jiān)O(shè)置好CXF_HOME的路徑和JAVA_HOME一樣,并在path中加入路徑,進(jìn)入cmd后直接輸入cxf version可以看見(jiàn)版本號(hào)代表設(shè)置成功
在eclipse中新建一個(gè)web項(xiàng)目,開(kāi)始我們的CXF之旅吧
在web項(xiàng)目中,個(gè)人感覺(jué)web.xml是骨架,是提綱,是一切之根本,所以請(qǐng)打開(kāi)這個(gè)文件吧,在這里將加入我們的CXF的Servlet
1
<!-- Spring ApplicationContext配置文件的路徑,可使用通配符,多個(gè)路徑用,號(hào)分隔
2
此參數(shù)用于后面的Spring Context Loader -->
3
<context-param>
4
<param-name>contextConfigLocation</param-name>
5
<param-value>classpath*:spring/applicationContext*.xml</param-value>
6
</context-param>
7
8
<!--Spring ApplicationContext 載入 -->
9
<listener>
10
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
11
</listener>
12
<!-- Spring 刷新Introspector防止內(nèi)存泄露 -->
13
<listener>
14
<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
15
</listener>
16
17
<!-- CXF 配置 -->
18
<servlet>
19
<servlet-name>CXFServlet</servlet-name>
20
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
21
</servlet>
22
<servlet-mapping>
23
<servlet-name>CXFServlet</servlet-name>
24
<url-pattern>/ws/*</url-pattern>
25
</servlet-mapping>
在WEB-INF/lib中加入CXF的jar包。
在src/spring/中添加applicationContext-webservice.xml
內(nèi)容如下
1
<?xml version="1.0" encoding="UTF-8"?>
2
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3
xmlns:jaxws="http://cxf.apache.org/jaxws" xmlns:cxf="http://cxf.apache.org/core"
4
xsi:schemaLocation="http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
5
default-lazy-init="true">
6
7
<description>Apache CXF的Web Service配置</description>
8
9
<import resource="classpath:META-INF/cxf/cxf.xml" />
10
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
11
<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
12
13
<!-- jax-ws endpoint定義 -->
14
<jaxws:endpoint address="/tracedatasender"><!-- 你的webservice訪問(wèn)路徑 -->
15
<jaxws:implementor ref="traceDataSenderService" /><!--你要發(fā)布的service-->
16
</jaxws:endpoint>
17
18
<!-- WebService的實(shí)現(xiàn)Bean定義 -->
19
<bean id="traceDataSenderService" class="com.xxx.ws.impl.TraceDataSenderImpl" />
20
21
22
</beans>
對(duì)于CXF來(lái)說(shuō)返回的結(jié)果是不支持集合的,如果你想返回集合,你必須要在包裝一次,只能返回一個(gè)對(duì)象,里面可以有集合屬性,這個(gè)太不好了。
好了,我們接下來(lái)只要實(shí)現(xiàn)我們的Service就好了我們?nèi)タ纯碿om.xxx.ws.impl.TraceDataSenderImpl吧
1
/** *//**
2
2 大家請(qǐng)看聲明的定義
3
3 serviceName聲明了service的名稱
4
4 portName聲明了端口名稱
5
5 endpointInterface聲明了接口ITraceDataSender
6
6 targetNamespace聲明了訪問(wèn)根路徑
7
7 實(shí)現(xiàn)的方法很簡(jiǎn)單就是插入數(shù)據(jù)到數(shù)據(jù)庫(kù)中
8
8 數(shù)據(jù)是TraceData
9
9*/
10
10@WebService(serviceName = "TraceDataSenderService", portName = "TraceDataSenderServicePort", endpointInterface = "com.xxx.ws.ITraceDataSender", targetNamespace = "http://localhost:8080/tracesender")
11
11public class TraceDataSenderImpl implements ITraceDataSender
{
12
12public final String TASK_ID="2000001";
13
13 public void addTraceDate(TraceData traceData)
{
14
14 // TODO Auto-generated method stub
15
15 MyDBAccess dba = new MyDBAccess();
16
16 dba.open();
17
17 String tbn = "data_daily_"+this.getNow("yyyyMMdd");
18
18
19
19 dba.update("INSERT INTO `"+tbn+"`(task_id,srcobject,destiobject," +
20
20 "instance,stringvalue,ts,min,comment) VALUES("+TASK_ID+",'"+traceData.getArea()+
21
21 "','"+traceData.getDestdesc()+"','"+traceData.getSrcFlag()+"','"+
22
22 traceData.getDest()+"','"+traceData.getTs()+"',"+traceData.getIsReach()+
23
23 ",'"+traceData.getTraceips()+"')");
24
24 AddTraceResult result = new AddTraceResult();
25
25 result.setSuccess(success);
26
26 dba.close();
28
28 }
29
29}
涉及接口包括ITraceDataSender和數(shù)據(jù)TraceData,請(qǐng)看ITraceDataSender
1
1/** *//** *//** *//**
2
2 在這里定義好service的方法并聲明webservice相關(guān)信息
3
3*/
4
4@WebService(name = "TraceDataSenderService", targetNamespace = "http://localhost:8080/trancesender")
5
5public interface ITraceDataSender
{
6
6 public AddTraceResult addTraceDate(TraceData traceData);
7
7}
接下來(lái)是TraceData
1
2
3
import javax.xml.bind.annotation.XmlType;
4
5
@XmlType(name = "TraceData", namespace = "http://localhost:8080/tracesender")
6
public class TraceData
{
7
String area;
8
String srcFlag;
9
String dest;
10
String destdesc;
11
String traceips;
12
String ts;
13
String isReach;
14
/** *//**
15
* 區(qū)域-運(yùn)營(yíng)商 對(duì)應(yīng)srcobject
16
* @return
17
*/
18
public String getArea()
{
19
return area;
20
}
21
public void setArea(String area)
{
22
this.area = area;
23
}
24
/** *//**
25
* 運(yùn)營(yíng)商標(biāo)記 對(duì)應(yīng)instance
26
* @return
27
*/
28
public String getSrcFlag()
{
29
return srcFlag;
30
}
31
public void setSrcFlag(String srcFlag)
{
32
this.srcFlag = srcFlag;
33
}
34
/** *//**
35
* 目的地域名對(duì)應(yīng)stringvalue
36
* @return
37
*/
38
public String getDest()
{
39
return dest;
40
}
41
public void setDest(String dest)
{
42
this.dest = dest;
43
}
44
/** *//**
45
* 目的地中文描述destobject
46
* @return
47
*/
48
public String getDestdesc()
{
49
return destdesc;
50
}
51
public void setDestdesc(String destdesc)
{
52
this.destdesc = destdesc;
53
}
54
/** *//**
55
* Trace IP列表格式ip地址(時(shí)間),ip地址(時(shí)間)
56
* @return
57
*/
58
public String getTraceips()
{
59
return traceips;
60
}
61
public void setTraceips(String traceips)
{
62
this.traceips = traceips;
63
}
64
/** *//**
65
* 測(cè)試時(shí)間對(duì)應(yīng)ts格式y(tǒng)yyy-MM-dd HH:mm:ss
66
* @return
67
*/
68
public String getTs()
{
69
return ts;
70
}
71
public void setTs(String ts)
{
72
this.ts = ts;
73
}
74
/** *//**
75
* 是否可達(dá)對(duì)應(yīng)min
76
* @return
77
*/
78
public String getIsReach()
{
79
return isReach;
80
}
81
public void setIsReach(String isReach)
{
82
this.isReach = isReach;
83
}
84
85
86
87
}
一個(gè)最簡(jiǎn)單的webservice就可以發(fā)布了,啟動(dòng)tomcat訪問(wèn)http://localhost:8080/trancesender/ws/就能看到相關(guān)信息了,客戶端可以由CXF提供的工具自動(dòng)生成。

打開(kāi)命令行輸入如下信息 wsdl2java.bat -client -b build-client-binding.xml -exsh true http://localhost:8080/tracesender/ws/tracedatasender?wsdl 請(qǐng)確保你有了build-client-binding.xml 這個(gè)文件,此文件內(nèi)容如下
1
<jaxws:bindings wsdlLocation="http://localhost:8080/tracesender/ws/tracedatasender?wsdl"
2
xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"
3
xmlns:xs="http://www.w3.org/2001/XMLSchema"
4
xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
5
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
6
<jaxws:bindings node="wsdl:definitions/wsdl:types/xs:schema[@targetNamespace='http://localhost:8080/tracesender']">
7
</jaxws:bindings>
8
</jaxws:bindings>