Apache CXF提供方便的Spring整合方法,可以通過注解、Spring標簽式配置來暴露Web Services和消費Web Services。
@WebService和@WebMethod是WSDL映射Annotation.這些Annotation將描述Web Service的WSDL文檔元素和JAVA源代碼聯系在一起。@SOAPBinding是一個綁定的annotation,用來說明網絡協議和格式
1、@WebService annotation的元素name,serviceName和targetNamespace成員用來描述wsdl:protType,wsdl:service,和targetNameSpace生成WebService中的WSDL文件。
2、@SOAPBinding是一個用來描述SOAP格式和RPC的協議的綁定Annotation.
3、@WebMethod Annotation的operationName成員描述了wsdl:operation,而且它的操作描述了WSDL文件中的SOAPAction頭部,這是客戶端必須要放入到SOAPHeader中的數值,SOAP1.1中的一種約束。
4、@WebParam Annotation的partName成員描述了WSDL文檔中的wsdl:part.
5、@WebResult Annotation的partName成員描述了wsdl:part用來返回WSDL文檔的值。
接下來通過一個實例來講解CXF的使用方法。
首先請下載最新版本的CXF下載地址是http://cxf.apache.org/
下載好了cxf后請設置好CXF_HOME的路徑和JAVA_HOME一樣,并在path中加入路徑,進入cmd后直接輸入cxf version可以看見版本號代表設置成功
在eclipse中新建一個web項目,開始我們的CXF之旅吧
在web項目中,個人感覺web.xml是骨架,是提綱,是一切之根本,所以請打開這個文件吧,在這里將加入我們的CXF的Servlet
1
<!-- Spring ApplicationContext配置文件的路徑,可使用通配符,多個路徑用,號分隔
2
此參數用于后面的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防止內存泄露 -->
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
內容如下
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訪問路徑 -->
15
<jaxws:implementor ref="traceDataSenderService" /><!--你要發布的service-->
16
</jaxws:endpoint>
17
18
<!-- WebService的實現Bean定義 -->
19
<bean id="traceDataSenderService" class="com.xxx.ws.impl.TraceDataSenderImpl" />
20
21
22
</beans>
對于CXF來說返回的結果是不支持集合的,如果你想返回集合,你必須要在包裝一次,只能返回一個對象,里面可以有集合屬性,這個太不好了。
好了,我們接下來只要實現我們的Service就好了我們去看看com.xxx.ws.impl.TraceDataSenderImpl吧
1
/** *//**
2
2 大家請看聲明的定義
3
3 serviceName聲明了service的名稱
4
4 portName聲明了端口名稱
5
5 endpointInterface聲明了接口ITraceDataSender
6
6 targetNamespace聲明了訪問根路徑
7
7 實現的方法很簡單就是插入數據到數據庫中
8
8 數據是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和數據TraceData,請看ITraceDataSender
1
1/** *//** *//** *//**
2
2 在這里定義好service的方法并聲明webservice相關信息
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}
接下來是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
* 區域-運營商 對應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
* 運營商標記 對應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
* 目的地域名對應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地址(時間),ip地址(時間)
56
* @return
57
*/
58
public String getTraceips()
{
59
return traceips;
60
}
61
public void setTraceips(String traceips)
{
62
this.traceips = traceips;
63
}
64
/** *//**
65
* 測試時間對應ts格式yyyy-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
* 是否可達對應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
}
一個最簡單的webservice就可以發布了,啟動tomcat訪問http://localhost:8080/trancesender/ws/就能看到相關信息了,客戶端可以由CXF提供的工具自動生成。

打開命令行輸入如下信息 wsdl2java.bat -client -b build-client-binding.xml -exsh true http://localhost:8080/tracesender/ws/tracedatasender?wsdl 請確保你有了build-client-binding.xml 這個文件,此文件內容如下
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>