使用CXF来发布WebService

        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>

 

 




posted on 2011-04-09 13:18 Cloud kensin 阅读(3704) 评论(0)  编辑  收藏 所属分类: Java


只有注册用户登录后才能发表评论。


网站导航:
 
<2011年4月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

导航

统计

常用链接

留言簿(4)

随笔分类

相册

相册

搜索

最新评论