当前位置: 首页 > 编程日记 > 正文

使用Apache cxf 和Spring在Tomcat下发布Webservice指南

转载 http://blog.csdn.net/zhangzhaokun/article/details/4750021

最近学习了如何使用apache cxf和Spring发布webservice,虽然网上的资料很多,但是没有一个文档可以让读者按照操作步骤来实现完整的发布流程,都需要多篇文件杂合在一起,互相参考才可以完成第一个HelloWorld形式的Webservice。现在将我利用apache cxf和Spring发布webservice的详细的发布过程记录下来,以供后来者参考。

环境信息如下:

JDK1.5.15

Tomcat5.5.26

Spring2.5.5

apache-cxf-2.2.4

具体实现步骤如下:

(1)使用IDE建立WEB工程cxfservice

工程目录结构如下:

其中的WEB-INF/lib目录下的jar包为直接将apache-cxf-2.2.4.zip下载包中的apache-cxf-2.2.4/lib目录下的全部的jar,在学习过程中这种办法是最简单的了。

当然我们也可以用最少的Jar包来完成本实例的任务,首先要将cxf的依赖包加入,包括如下一些jar包:

[c-sharp] view plaincopy
  1. commons-logging-1.1.1.jar
  2. geronimo-activation_1.1_spec-1.0.2.jar (or Sun's Activation jar)
  3. geronimo-annotation_1.0_spec-1.1.1.jar (JSR 250)
  4. geronimo-javamail_1.4_spec-1.6.jar (or Sun's JavaMail jar)
  5. geronimo-servlet_2.5_spec-1.2.jar (or Sun's Servlet jar)
  6. geronimo-ws-metadata_2.0_spec-1.1.2.jar (JSR 181)
  7. geronimo-jaxws_2.1_spec-1.0.jar (or Sun's jaxws-api-2.1.jar)
  8. geronimo-stax-api_1.0_spec-1.0.1.jar (or other stax-api jar)
  9. jaxb-api-2.1.jar
  10. jaxb-impl-2.1.12.jar
  11. jetty-6.1.21.jar
  12. jetty-util-6.1.21.jar
  13. neethi-2.0.4.jar
  14. saaj-api-1.3.jar
  15. saaj-impl-1.3.2.jar
  16. wsdl4j-1.6.2.jar
  17. wstx-asl-3.2.8.jar
  18. XmlSchema-1.4.5.jar
  19. xml-resolver-1.2.jar

再就是Spring的包了,包括如下一些

[c-sharp] view plaincopy
  1. aopalliance-1.0.jar
  2. spring-core-2.5.5.jar
  3. spring-beans-2.5.5.jar
  4. spring-context-2.5.5.jar
  5. spring-web-2.5.5.jar

最后就是apache cxf本身的包了

[c-sharp] view plaincopy
  1. cxf-2.2.3.jar

(2)配置文件说明

applicationContext.xml文件的内容如下:

[c-sharp] view plaincopy
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans
  3. xmlns="http://www.springframework.org/schema/beans"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
  6. <import resource="classpath*:META-INF/cxf/cxf.xml" />
  7. <import resource="classpath*:META-INF/cxf/cxf-extension-soap.xml" />
  8. <import resource="classpath*:META-INF/cxf/cxf-servlet.xml" />
  9. <import resource="classpath:services.xml" />
  10. </beans>

services.xml文件的内容如下:

[c-sharp] view plaincopy
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:jaxws="http://cxf.apache.org/jaxws"
  5. xsi:schemaLocation="
  6. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  7. http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
  8. <jaxws:endpoint id="webServiceHelloWorld"
  9. address="/HelloWorld" implementor="com.cxf.test.interfaces.HelloWorldImpl"/>
  10. </beans>

web.xml文件的内容如下:

[c-sharp] view plaincopy
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  3. <display-name>cxfservice</display-name>
  4. <context-param>
  5. <param-name>contextConfigLocation</param-name>
  6. <param-value>WEB-INF/classes/applicationContext.xml</param-value>
  7. </context-param>
  8. <listener>
  9. <listener-class>
  10. org.springframework.web.context.ContextLoaderListener
  11. </listener-class>
  12. </listener>
  13. <servlet>
  14. <servlet-name>CXFServlet</servlet-name>
  15. <servlet-class>
  16. org.apache.cxf.transport.servlet.CXFServlet
  17. </servlet-class>
  18. </servlet>
  19. <servlet-mapping>
  20. <servlet-name>CXFServlet</servlet-name>
  21. <url-pattern>/services/*</url-pattern>
  22. </servlet-mapping>
  23. <welcome-file-list>
  24. <welcome-file>index.html</welcome-file>
  25. <welcome-file>index.htm</welcome-file>
  26. <welcome-file>index.jsp</welcome-file>
  27. <welcome-file>default.html</welcome-file>
  28. <welcome-file>default.htm</welcome-file>
  29. <welcome-file>default.jsp</welcome-file>
  30. </welcome-file-list>
  31. </web-app>

(3)发布的HelloWord服务说明

要发布的HelloWorld服务的接口定义文件com.cxf.test.interfaces.HelloWorld:

[java] view plaincopy
  1. package com.cxf.test.interfaces;
  2. import javax.jws.WebParam;
  3. import javax.jws.WebResult;
  4. import javax.jws.WebService;
  5. @WebService
  6. public interface HelloWorld
  7. {
  8. /*
  9. * 一个简单的方法,返回一个字符串
  10. *
  11. * @param hello
  12. *
  13. * @return
  14. */
  15. String say(String hello);
  16. /**
  17. * 稍微复杂一些的方法,传递一个对象给服务端处理
  18. *
  19. * @param user
  20. * @return
  21. */
  22. String sayUserName(@WebParam(name = "user") UserDTO user);
  23. /**
  24. * 最复杂的方法,返回一个List封装的对象集合
  25. *
  26. * @return
  27. */
  28. public @WebResult(partName = "o") ListObject findUsers();
  29. }

要发布的HelloWorld服务的接口实现类com.cxf.test.interfaces.HelloWorldImpl:

[java] view plaincopy
  1. package com.cxf.test.interfaces;
  2. import java.util.ArrayList;
  3. import javax.jws.WebService;
  4. /**
  5. * @author zhangzk
  6. *
  7. */
  8. /**
  9. * WebService实现类.
  10. *
  11. * 使用@WebService指向Interface定义类即可.
  12. */
  13. @WebService(endpointInterface = "com.cxf.test.interfaces.HelloWorld")
  14. public class HelloWorldImpl implements HelloWorld
  15. {
  16. public String sayUserName(UserDTO user)
  17. {
  18. return "hello " + user.getName();
  19. }
  20. public String say(String hello)
  21. {
  22. return "hello " + hello;
  23. }
  24. public ListObject findUsers()
  25. {
  26. ArrayList<Object> list = new ArrayList<Object>();
  27. list.add(instancUser(1, "lib"));
  28. list.add(instancUser(2, "mld"));
  29. list.add(instancUser(3, "lq"));
  30. list.add(instancUser(4, "gj"));
  31. ListObject o = new ListObject();
  32. o.setList(list);
  33. return o;
  34. }
  35. private UserDTO instancUser(Integer id, String name)
  36. {
  37. UserDTO user = new UserDTO();
  38. user.setId(id);
  39. user.setName(name);
  40. return user;
  41. }
  42. }

findUsers()接口返回的参数对象定义文件com.cxf.test.interfaces.ListObject:

[c-sharp] view plaincopy
  1. package com.cxf.test.interfaces;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import javax.xml.bind.annotation.XmlAccessType;
  5. import javax.xml.bind.annotation.XmlAccessorType;
  6. import javax.xml.bind.annotation.XmlElement;
  7. import javax.xml.bind.annotation.XmlType;
  8. @XmlAccessorType(XmlAccessType.FIELD)
  9. @XmlType(name = "listObject", propOrder ={ "list" })
  10. public class ListObject
  11. {
  12. @XmlElement(nillable = true)
  13. protected List<Object> list;
  14. /**
  15. * Gets the value of the list property.
  16. *
  17. * <p>
  18. * This accessor method returns a reference to the live list, not a snapshot. Therefore any modification you make to the returned list will be
  19. * present inside the JAXB object. This is why there is not a <CODE>set</CODE> method for the list property.
  20. *
  21. * <p>
  22. * For example, to add a new item, do as follows:
  23. *
  24. * <pre>
  25. * getList().add(newItem);
  26. * </pre>
  27. *
  28. *
  29. * <p>
  30. * Objects of the following type(s) are allowed in the list {@link Object }
  31. *
  32. *
  33. */
  34. public List<Object> getList()
  35. {
  36. if (list == null)
  37. {
  38. list = new ArrayList<Object>();
  39. }
  40. return this.list;
  41. }
  42. public void setList(ArrayList<Object> list)
  43. {
  44. this.list = list;
  45. }
  46. }

UserDTO instancUser(Integer id, String name)接口返回的对象定义文件com.cxf.test.interfaces.UserDTO:

[c-sharp] view plaincopy
  1. package com.cxf.test.interfaces;
  2. import javax.xml.bind.annotation.XmlAccessType;
  3. import javax.xml.bind.annotation.XmlAccessorType;
  4. import javax.xml.bind.annotation.XmlType;
  5. /**
  6. * Web Service传输User信息的DTO.
  7. *
  8. * 分离entity类与web service接口间的耦合,隔绝entity类的修改对接口的影响. 使用JAXB 2.0的annotation标注JAVA-XML映射,尽量使用默认约定.
  9. *
  10. */
  11. @XmlAccessorType(XmlAccessType.FIELD)
  12. @XmlType(name = "User")
  13. public class UserDTO
  14. {
  15. protected Integer id;
  16. protected String name;
  17. public Integer getId()
  18. {
  19. return id;
  20. }
  21. public void setId(Integer value)
  22. {
  23. id = value;
  24. }
  25. public String getName()
  26. {
  27. return name;
  28. }
  29. public void setName(String value)
  30. {
  31. name = value;
  32. }
  33. }

(4)将WEB工程发布到Tomcat下作为一个WEB应用,webContext为cxfservice,Port为9000

启动Tomcat后,以如下方式访问http://localhost:9000/cxfservice/services/HelloWorld?wsdl即可看到我们发布的Webservices服务HelloWorld了。在浏览器中将看到的WSDL文件另存为HelloWorld.xml即为发布的Webservice的WSDL文件。后续的调用过程与其它的操作方式完全相同。

转载于:https://www.cnblogs.com/chenying99/archive/2012/11/21/2781070.html

相关文章:

srcache_nginx redis 构建缓存系统应用一例

为什么80%的码农都做不了架构师&#xff1f;>>> srcache_nginx模块相关参数介绍&#xff0c;可以参见 《memc_nginxsrcache_nginxmemcached构建透明的动态页面缓存》。 redis是一种高效的key-value存储。 下面举一例应用&#xff0c;看配置&#xff1a; upstream r…

mysql 删除 修改密码_Mysql数据库root密码忘记了,如何在不删除Mysql的情况下修改密码...

1.cmd中使用 net stop mysql 命令停掉正在运行的mysql 数据库。2.在本地中复制Mysql数据库的安装路径一直到bin路径下。3.到cmd执行 "pushd 步骤2复制路径" 的命令&#xff0c;就会到Mysql数据库安装的bin路径下。4.紧接著执行 mysqld --skip-grant-tables 命令…

通用权限管理系统组件 (GPM - General Permissions Manager) 权限管理以前我们都是自己开发,可是到下一个系统又不适用,又改,加上人员流动大,管理很混乱...

为什么80%的码农都做不了架构师&#xff1f;>>> 权限管理以前我们都是自己开发&#xff0c;可是到下一个系统又不适用&#xff0c;又改&#xff0c;加上人员流动大&#xff0c;管理很混乱 Ψ吉日嘎拉 采用通用权限管理系统&#xff0c;这些烦恼就少了很多了&#x…

【小白的CFD之旅】16 流程

那天听了小牛师兄关于CFD应用的四种境界的说法后&#xff0c;小白发现自己连第一种境界都算不上&#xff0c;自己对于CFD还只是停留在做了少数几个案例的基础上&#xff0c;可以说是对其一无所知。不过小白不是那种遇到挫折就退缩的人&#xff0c;他决定沿着黄师姐的方法从软件…

XWiki 4.3 正式版发布

XWiki 4.3 正式版发布了&#xff0c;工作空间、扩展管理器、分发向导和 REST API 做了很多改进&#xff0c;改进了翻译和新的体验的 Solr 搜索。 XWiki是一个由Java编写的基于LGPL协议发布的开源wiki和应用平台。它的开发平台特性允许创建协作式Web应用&#xff0c;同时也提供了…

新建异常并处理java_java – 动态创建异常的工厂模式

我创建了Exception xml并动态创建并抛出异常.com.package.CheckedExceptionChecked Exception Messagecom.package.UnCheckedExceptionUnChecked Exception Message我根据异常键使用反射动态创建异常对象.public static void throwException(final String key) throws CheckedE…

React navtive

http://www.linuxidc.com/Linux/2015-09/123239.htm 转载于:https://www.cnblogs.com/chenzhenfj/p/5203685.html

c# Pdf 转换图片

1&#xff0c;引入 dll itextsharp.dll、 PDFView.dll、 把 gsdll32.dll 拷贝在项目 bin目录下 &#xff0c;注意&#xff1a;它不能 直接引用 直接上代码&#xff1a; 1 /// <summary>2 /// 将PDF 相应的页转换为图片3 /// </summary>4 …

Entity Framework 约定

约定&#xff0c;类似于接口&#xff0c;是一个规范和规则&#xff0c;使用Code First 定义约定来配置模型和规则。在这里约定只是记本规则&#xff0c;我们可以通过Data Annotaion或者Fluent API来进一步配置模型。约定的形式有如下几种&#xff1a; 类型发现约定主键约定关系…

java用构造方法定义book类_JAVA基础学习之路(三)类定义及构造方法

类的定义及使用一&#xff0c;类的定义classBook {//定义一个类intprice;//定义一个属性intnum;public static int getMonney(int price, intnum) {//定义一个方法return price*num;}}public classtest2 {public static voidmain(String args[]) {Book monney newBook();//声明…

Linux下如何查看文档的内容

查看文档内容的命令有&#xff1a;cat tac head nl tail more less odcat命令显示文档的全部内容&#xff0c;当文档较大的时候只显示最后的部分&#xff0c;所以cat命令适合查看内容较少的文档。可加选项-n显示行数(此时空白行也会显示行号)。-b空白行则不显示行号。tac与cat显…

Java中getResourceAsStream的用法

Java中getResourceAsStream的用法 首先&#xff0c;Java中的getResourceAsStream有以下几种&#xff1a;1. Class.getResourceAsStream(String path) &#xff1a; path 不以’/开头时默认是从此类所在的包下取资源&#xff0c;以’/开头则是从 ClassPath根下获取。其只是通过p…

Asp.Net MVC3 简单入门详解过滤器Filter

为什么80%的码农都做不了架构师&#xff1f;>>> 前言 在开发大项目的时候总会有相关的AOP面向切面编程的组件&#xff0c;而MVC&#xff08;特指&#xff1a;Asp.Net MVC&#xff0c;以下皆同&#xff09;项目中不想让MVC开发人员去关心和写类似身份验证&#xff0…

mysql 锁语句_mysql-笔记 事务 锁 语句

Start Transaction 或 begin [work] 开始一个事务&#xff0c;开始一个事务&#xff0c;引起其他未提交的事务提交&#xff0c;引起表锁释放commit 提交事务&#xff0c;永久修改rollback 回滚事务&#xff0c;撤消修改set autocommit 在当前会话状态下 启用或不启用 autocommi…

【收藏】Java多线程/并发编程大合集

&#xff08;一&#xff09;、【Java并发编程】并发编程大合集-兰亭风雨 【Java并发编程】实现多线程的两种方法 【Java并发编程】线程的中断 【Java并发编程】正确挂起、恢复、终止线程 【Java并发编程】守护线程和线程阻塞 【Java并发编程】Volatile关键字&#xff08;上&…

《深入理解Android:Wi-Fi,NFC和GPS》章节连载[节选]--第六章 深入理解wi-Fi Simple Configuration...

为什么80%的码农都做不了架构师&#xff1f;>>> 首先感谢各位兄弟姐妹们的耐心等待。本书预计在4月上市发售。从今天开始&#xff0c;我将在博客中连载此书的一些内容。注意&#xff0c;此处连载的是未经出版社编辑的原始稿件&#xff0c;所以样子会有些非专业。 …

iOS 的本地化使用和创建过程

在使用本地化语言之前&#xff0c;来看看本地化语言文件内容的结构&#xff08;这里我以Chinese为例&#xff09;&#xff1a;"Cancel""取消";"OK""确定";"Tip""信息提示";"Login Faild""登陆失败…

MySQL中改变相邻学生座位_力扣——换座位(数据库的题

小美是一所中学的信息科技老师&#xff0c;她有一张 seat 座位表&#xff0c;平时用来储存学生名字和与他们相对应的座位 id。其中纵列的 id 是连续递增的小美想改变相邻俩学生的座位。你能不能帮她写一个 SQL query 来输出小美想要的结果呢&#xff1f;示例&#xff1a;------…

AnsiToUtf8 和 Utf8ToAnsi

在服务端数据库的处理当中&#xff0c;涉及中文字符的结构体字段&#xff0c;需要转为Utf8后再存储到表项中。从数据库中取出包含中文字符的字段后&#xff0c;如果需要保存到char *类型的结构体成员中&#xff0c;需要转为Ansi后再保存。从数据库中取出类型数字的字段后&#…

常见面试题:重写strcpy() 函数原型

已知strcpy函数的原型是 char* strcpy(char* strDest,const char* strSrc); 1.不调用库函数&#xff0c;实现strcpy函数 2.解释为什么要返回char*; 1.strcpy的实现代码 char* strcpy(char* strDest,const char* strSrc) { if((strDest NULL) || (strSrc NULL)) //[1] thro…

mongodb 系列 ~ journal日志畅谈

一 简介 我们来聊聊Journal日志二 核心观点 WAL 日志先行策略三 开启journal流程 在开启journal的系统中&#xff0c;写操作从请求到写入磁盘共经历5个步骤&#xff0c;在serverStatus()中已经列出各个步骤消耗的时间。 1 Write to privateView 2 prepLogBuffer …

java striptrailingzeros_java – 为什么不BigDecimal.stripTrailingZeros()总是删除所有尾随零?...

我做了以下事情MathContext context new MathContext(7, RoundingMode.HALF_UP);BigDecimal roundedValue new BigDecimal(value, context);// Limit decimal placestry {roundedValue roundedValue.setScale(decimalPlaces, RoundingMode.HALF_UP);} catch (NegativeArrayS…

box-shadow属性

一、定义和用法 box-shadow属性 向框添加一个或多个阴影。 二、语法 box-shadow: h-shadow v-shadow blur spread color inset; h-shadow必需。水平阴影的位置。允许负值。 v-shadow必需。垂直阴影的位置。允许负值。 blur可选。模糊距离。 spread可选。阴影的尺寸。 color可选…

秋色园QBlog技术原理解析:性能优化篇:用户和文章计数器方案(十七)

2019独角兽企业重金招聘Python工程师标准>>> 上节概要&#xff1a; 上节 秋色园QBlog技术原理解析&#xff1a;性能优化篇&#xff1a;access的并发极限及分库分散并发方案(十六) 中&#xff0c; 介绍了 Access的并发上限&#xff0c;及从某种程度上 秋色园QBlog 针…

ldconfig

为了让动态链接库为系统所共享,还需运行动态链接库的管理命令--ldconfigldconfig 命令的用途,主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态 链接库(格式如前介绍,lib*.so*),进而创建出动态装入程序(ld.so)所需的连…

MySQL宽字节注入漏洞分析_宽字节注入

概念单字节字符集&#xff1a; 所有的字符都使用一个字节来表示&#xff0c;比如 ASCII 编码。多字节字符集&#xff1a; 在多字节字符集中&#xff0c;一部分字节用多个字节来表示&#xff0c;另一部分(可能没有)用单个字节来表示。两位的多字节字符有一个前导字节和尾字节。 …

objc runtime 动态增加属性

objective-c中&#xff0c;有类别可以在不修改源码的基础上增加方法 使用运行时库&#xff0c;必须要先引入 objc/runtime.h 可以使用的函数如下&#xff1a; OBJC_EXPORT void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy…

C#合并两张表结构相同(列数和列类型都相同)的表

DataTable appendDataTablenew DataTable(); 这个合并的大前提是两张表的结构相同且列的类型也必须相同 否则在赋值时就会出现异常。 for (int i 0; i < hostDt.Columns.Count;i ) { appendDataTable.Columns.Add(hostDt.Columns[i].ColumnName,hostDt.Columns[i].DataType…

erlang调优方法

2019独角兽企业重金招聘Python工程师标准>>> 1. 来自Scaling Erlang的方法 内核调优&#xff1a; # Increase the ipv4 port range: sysctl -w net.ipv4.ip_local_port_range"1024 65535" # General gigabit tuning: sysctl -w net.core.rmem_max16777…

mysql第四章_MySQL必知必会--第二章~第四章--MySQL简介

1.DBMS可分为两类:一类为基于共享文件系统的DBMS&#xff0c;另一类为基于客户机—服务器的DBMS。服务器部分是 负责所有数据访问和处理的一个软件。这个软件运行在称为数据库服务 器的计算机上。2.MySQL Administrator(MySQL管理器)是一个图形交互客户机&#xff0c;用 来简化…