FROM:http://blog.csdn.net/yuvmen/archive/2009/11/09/4790805.aspx

主要参考http://cxf.apache.org的相关内容:

1.使用CXF创建服务的基本方法(使用CXF自带的jetty容器

参考:http://cxf.apache.org/docs/a-simple-jax-ws-service.html

分4步:

① 设置build环境

② 写服务

③ 发布服务

④ 访问服务

1)设置build环境

创建一个新项目,将apache-cxf-2.2.4.zip中lib目录中的下列文件添加到Build Path:

commons-logging-1.1.1.jar

geronimo-activation_1.1_spec-1.0.2.jar (or Sun's Activation jar)

geronimo-annotation_1.0_spec-1.1.1.jar (JSR 250)

geronimo-javamail_1.4_spec-1.6.jar (or Sun's JavaMail jar)

geronimo-servlet_2.5_spec-1.2.jar (or Sun's Servlet jar)

geronimo-ws-metadata_2.0_spec-1.1.2.jar (JSR 181)

geronimo-jaxws_2.1_spec-1.0.jar (or Sun's jaxws-api-2.1.jar)

geronimo-stax-api_1.0_spec-1.0.1.jar (or other stax-api jar)

jaxb-api-2.1.jar

jaxb-impl-2.1.12.jar

jetty-6.1.21.jar

jetty-util-6.1.21.jar

neethi-2.0.4.jar

saaj-api-1.3.jar

saaj-impl-1.3.2.jar

wsdl4j-1.6.2.jar

wstx-asl-3.2.8.jar

XmlSchema-1.4.5.jar

xml-resolver-1.2.jar

cxf-2.2.4.jar

可选:添加Spring jars,为XML Configuration添加Spring支持。添加的jars如下:

aopalliance-1.0.jar

spring-core-2.5.5.jar

spring-beans-2.5.5.jar

spring-context-2.5.5.jar

spring-web-2.5.5.jar

2)写服务

A)写接口

@WebService

public interface HelloWorld {

String sayHi(String text);

// JAX-WS/JAXB 不能直接支持高级用例,处理他们需要写特殊的XmlAdapter

String sayHiToUser(User user);

/* Map 传递

* JAXB 不支持 Maps。它能很好的处理Lists,但Maps不能直接支持他们。

* 他们也需要使用一个XmlAdapter来将maps映射进JAXB可以使用的beans

*/

@XmlJavaTypeAdapter(IntegerUserMapAdapter.class)

Map<Integer, User> getUsers();

}

注意:wsdl会重命名参数的名字,如果不希望这样,应该这样写:

@WebService

public interface HelloWorld {

String sayHi(@WebParam(name="text") String text);

}

B)写实现:

package demo.hw.server;

import java.util.LinkedHashMap;

import java.util.Map;

import javax.jws.WebService;

@WebService(endpointInterface = "demo.hw.server.HelloWorld",

serviceName = "HelloWorld")    //告诉CXF用哪一个接口创建WSDL

public class HelloWorldImpl implements HelloWorld {

Map<Integer, User> users = new LinkedHashMap<Integer, User>();

public String sayHi(String text) {

System.out.println("sayHi called");

return "Hello " + text;

}

public String sayHiToUser(User user) {

System.out.println("sayHiToUser called");

users.put(users.size() + 1, user);

return "Hello "  + user.getName();

}

public Map<Integer, User> getUsers() {

System.out.println("getUsers called");

return users;

}

}

3)发布服务(CXF自带Jetty服务器,所以无需Tomcat就可发布)

A)使用jws的高层封装:

System.out.println("Starting Server");

HelloWorldImpl implementor = new HelloWorldImpl();

String address = "http://localhost:9000/helloWorld";

Endpoint.publish(address, implementor);

B)使用下列代码比较精确地控制服务的行为:

HelloWorldImpl implementor = new HelloWorldImpl();

JaxWsServerFactoryBean svrFactory = new JaxWsServerFactoryBean();

svrFactory.setServiceClass(HelloWorld.class);   //可省,但不建议,因为可能会有些小问题

svrFactory.setAddress("http://localhost:9000/helloWorld");

svrFactory.setServiceBean(implementor);

svrFactory.getInInterceptors().add(new LoggingInInterceptor());

svrFactory.getOutInterceptors().add(new LoggingOutInterceptor());

svrFactory.create();

自此,可以通过http://localhost:9000/helloWorld?wsdl来显示该服务的wsdl

LoggingInInterceptor和LoggingOutInterceptor是日志拦截器,用于输入和输出时显示日志,下同。

4)访问服务

A)使用jws的高层封装:

//第一个参数是接口实现类包名的反缀

private static final QName SERVICE_NAME = new QName("http://server.hw.demo/", "HelloWorld");

private static final QName PORT_NAME= new QName("http://server.hw.demo/", "HelloWorldPort");

……

Service service = Service.create(SERVICE_NAME);

// Endpoint Address

String endpointAddress = "http://localhost:9000/helloWorld";

// Add a port to the Service

service.addPort(PORT_NAME, SOAPBinding.SOAP11HTTP_BINDING, endpointAddress);

HelloWorld hw = service.getPort(HelloWorld.class);

System.out.println(hw.sayHi("World"));

B)或者使用下面代码更精确的控制服务:

JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();

factory.getInInterceptors().add(new LoggingInInterceptor());

factory.getOutInterceptors().add(new LoggingOutInterceptor());

factory.setServiceClass(HelloWorld.class);

factory.setAddress("http://localhost:9000/helloWorld");

HelloWorld client = (HelloWorld) factory.create();

String reply = client.sayHi("HI");

System.out.println("Server said: " + reply);

System.exit(0);

2.wsdl2java:从wsdl文档中生成java类,供client使用

设置环境变量CXF_HOME=D:\Program Files\apache-cxf-2.2.4,PATH后加上“;%CXF_HOME%\bin”(可选),然后执行wsdl2java批处理程序,用法如下:
wsdl2java –p 包名 –d 目录名 wsdl路径
如:wsdl2java –p demo.service.client –d e:\src htt://localhost:8080/helloWorld?wsdl
-p  指定其wsdl的命名空间,也就是要生成代码的包名
-d  指定要产生代码所在目录
-client 生成客户端测试web service的代码
-server 生成服务器启动web  service的代码
-impl 生成web service的实现代码
-ant  生成build.xml文件
-all 生成所有开始端点代码:types,service proxy,,service interface, server mainline, client mainline, implementation object, and an Ant build.xml file.
详细用法见http://cwiki.apache.org/CXF20DOC/wsdl-to-java.html

3.定义复杂类型(基本类型如int,String,无须额外定义),参考资料:http://cxf.apache.org/docs/defining-contract-first-webservices-with-wsdl-generation-from-java.html

例如:

package com.example.customerservice;

@XmlAccessorType( XmlAccessType.FIELD )

public class Customer {  //自定义类

String name;

String\[\] address;

int numOrders;

double revenue;

BigDecimal test;

Date birthDate;

CustomerType type; //自定义枚举类型

}

public enum CustomerType {

PRIVATE, BUSINESS

}

//定义Exception

@WebFault(name="NoSuchCustomer")

@XmlAccessorType( XmlAccessType.FIELD )

public class NoSuchCustomerException extends RuntimeException {

/**

* We only define the fault details here. Additionally each fault has a message

* that should not be defined separately

*/

String customerName;

}     //定义Exceptions的默认行为是在后面生成Java code时创建Exception_Exception,所以必须用@WebFault标记来为Bean取一个名字,以与Exception名字相区别

@WebService    //标记本接口为一个服务

public interface CustomerService {

public Customer[] getCustomersByName(@WebParam(name="name") String name) throws NoSuchCustomerException;     //@WebParam标记wsdl中的参数名。如果省略,wsdl将使用arg0代替

}

// @WebService还可用来自定义接口名和服务名,分别对应:endpointInterface和serviceName,如:

@WebService(endpointInterface = "com.example.customerservice", serviceName = "HelloWorld")

生成的WSDL

<xs:complexTypeCOLOR: green">customer">  //复杂类型

<xs:sequence>

<xs:element minOccurs="0"COLOR: green">name" type="xs:string"/>

<xs:element maxOccurs="unbounded" minOccurs="0"COLOR: green">address" nillable="true"COLOR: green">xs:string"/>

<xs:elementCOLOR: green">numOrders"COLOR: green">xs:int"/>

<xs:elementCOLOR: green">revenue"COLOR: green">xs:double"/>

<xs:element minOccurs="0"COLOR: green">test"COLOR: green">xs:decimal"/>

<xs:element minOccurs="0"COLOR: green">birthDate"COLOR: green">xs:dateTime"/>

<xs:element minOccurs="0"COLOR: green">type"COLOR: green">tns:customerType"/>

</xs:sequence>

</xs:complexType>

minOccurs="0"是可选项,这样可以随时加入新元素,保持兼容性。如果不想要这个选项,可以使用标记@XmlElement(required=true)

maxOccurs="unbounded"是为了便于后面的xml重复该元素以形成数组。

<xs:simpleTypeCOLOR: green">customerType">    //枚举类型

<xs:restriction base="xs:string">

<xs:enumeration value="PRIVATE"/>

<xs:enumeration value="BUSINESS"/>

</xs:restriction>

</xs:simpleType>

<xs:elementCOLOR: green">NoSuchCustomer"COLOR: green">tns:NoSuchCustomer"/> //异常类

<xs:complexTypeCOLOR: green">NoSuchCustomer">

<xs:sequence>

<xs:elementCOLOR: green">customerName" nillable="true"COLOR: green">xs:string"/>

</xs:sequence>

</xs:complexType>

<wsdl:messageCOLOR: green">NoSuchCustomerException">

<wsdl:partCOLOR: green">NoSuchCustomerException" element="tns:NoSuchCustomer">

</wsdl:part>

</wsdl:message>

// 注意:Element和Message的名字是不同的,这是通过标记@Webfault标记来实现的。也可以让他们同名,但那样会话,生成的Exception的名字会比较丑:NoSuchCustomerException_Exception

(转)CXF学习笔记一:如何创建、发布和访问基于CXF的服务相关推荐

  1. ros学习笔记12——python实现发布和接收ros topic

    ros学习笔记12--python实现发布和接收ros topic 一.简单demo 1.工作空间是存放工程开发的相关文件的文件夹 2.创作工作空间指令 3 .创建功能包 4. 创建Topic的订阅发 ...

  2. 【opencv学习笔记八】创建TrackBar轨迹条

    createTrackbar这个函数我们以后会经常用到,它创建一个可以调整数值的轨迹条,并将轨迹条附加到指定的窗口上,使用起来很方便.首先大家要记住,它往往会和一个回调函数配合起来使用.先看下他的函数 ...

  3. Linux学习笔记---使用BusyBox创建根文件系统(四)

    目录 软件运行测试 设置程序为后台运行 设置开机自启动 外网连接测试 软件运行测试 进入到rootfs文件夹中新建一个drivers文件夹,用于存放编写的软件. 新建hello.c文件 输入以下代码 ...

  4. Linux学习笔记---使用BusyBox创建根文件系统(三)

    目录 创建/etc/init.d/rcS 文件 创建/etc/fstab 文件 创建/etc/inittab 文件 创建/etc/init.d/rcS 文件 通过nfs加载根文件系统成功后,在串口终端 ...

  5. Linux学习笔记---使用BusyBox创建根文件系统(二)

    目录 向 rootfs 的"/lib "目录添加库文件 向 rootfs 的usr/lib 目录添加库文件 创建其他文件夹 根文件系统初步测试 向 rootfs 的"/l ...

  6. Linux学习笔记---使用BusyBox创建根文件系统(一)

    目录 下载BusyBox 修改makefile 添加中文支持 编译busybox 下载BusyBox BusyBox 可以在其官网下载到,官网地址为:https://busybox.net 打开官网后 ...

  7. ROS学习笔记八:创建ROS msg和srv

    ROS学习笔记八:创建ROS msg和srv 本节主要讲述了如何创建和建立ROS msg和srv,同时使用命令行工具rosmsg.rossrv和roscp. msg和srv简介 msg:描述ROS m ...

  8. ROS学习笔记三:创建ROS软件包

    ,# ROS学习笔记三:创建ROS软件包 catkin软件包的组成 一个软件包必须满足如下条件才能被称之为catkin软件包: 这个软件包必须包含一个catkin编译文件package.xml(man ...

  9. 学习笔记--存储过程的创建和调用

    学习笔记–存储过程的创建和调用 定义 存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在程序中就可以调用多次.如果某次操作需要执行多次SQL,使用存储过程比单纯SQL ...

最新文章

  1. python 案例串接_来撸串,一个案例轻松认识Python 字符串——翻转拼接游戏
  2. 模拟实现智能指针auto_ptr,scoped_ptr,shared_ptr
  3. 【问题解决方案】ImportError: No module named 'openpyxl'/‘xlrd’
  4. PageRank算法--从原理到实现
  5. OpenBoard的板级支持包(BSP)开发召集令
  6. NYOJ 137 取石子(三)
  7. 51nod1258 序列求和 V4(伯努利数+多项式求逆)
  8. 基于.NET SingalR,LayIM2.0实现的web聊天室
  9. DTW动态时间规整算法
  10. nginx设置http强制跳转https
  11. 《构建之法》第4章读后感
  12. 在centos linux上安装jdk7
  13. 2021腾讯广告算法大赛联手ACM MM,共百万奖金池!
  14. win10系统文件拖拽卡顿_如何解决Win10鼠标拖动窗口有延迟?
  15. 装甲逆袭-NPC移动处理
  16. 福建云服务器虚拟,云服务器
  17. Linux-开机引导过程 | MBR、GRUB、ROOT密码找回讲解 | 超详细
  18. 服务网关配置:Zuul
  19. 详细分析PHP源代码后门事件及其供应链安全启示
  20. 计算机教室100字介绍,班级简介范文100字

热门文章

  1. C语言 | 函数指针、指针函数、数组指针、指针数组
  2. -bash:XXX: command not found报错(云服务centos)
  3. 关于conda和anaconda不可不知的误解和事实——conda必知必会
  4. GDI编程注意点-1
  5. html iframe 播放视频播放,播放iframe视频点击链接javascript
  6. 8分钟答辩稿_干货 | 论文答辩,该掌握哪些技巧?
  7. TensorFlow 笔记2--MNIST手写数字分类
  8. Debug Tensorflow: Object was never used (type <class ‘tensorflow.python.ops.tensor_array_ops.TensorA
  9. tensorflow随笔-非线性回归
  10. 【机器学习基础】深入理解极大似然估计(MLE) 1: 引入问题