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>