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
11/** *//** *//** *//**
22 在这里定义好service的方法并声明webservice相关信息
33*/
44@WebService(name = "TraceDataSenderService", targetNamespace = "http://localhost:8080/trancesender")
55public interface ITraceDataSender {
66 public AddTraceResult addTraceDate(TraceData traceData);
77}
接下来是TraceData
1
2
3import javax.xml.bind.annotation.XmlType;
4
5@XmlType(name = "TraceData", namespace = "http://localhost:8080/tracesender")
6public 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>