CXF实现WebService

article/2025/9/13 21:06:13

一、CXF简介

Apache CXF = Celtix + XFire,开始叫 Apache CeltiXfire,后来更名为 Apache CXF 了,以下简称为 CXF。CXF 继承了 Celtix 和 XFire 两大开源项目的精华,提供了对 JAX-WS 全面的支持,并且提供了多种 Binding 、DataBinding、Transport 以及各种 Format 的支持,并且可以根据实际项目的需要,采用代码优先(Code First)或者 WSDL 优先(WSDL First)来轻松地实现 Web Services 的发布和使用。Apache CXF已经是一个正式的Apache顶级项目。
CXF 是一个开源的 Services 框架,CXF 帮助您利用 Frontend 编程 API 来构建和开发 Services ,像 JAX-WS 。这些 Services 可以支持多种协议,比如:SOAP、XML/HTTP、RESTful HTTP 或者 CORBA ,并且可以在多种传输协议上运行,比如:HTTP、JMS 或者 JBI,CXF 大大简化了 Services 的创建,同时它继承了 XFire 传统,一样可以天然地和 Spring 进行无缝集成。
特性:
支持 Web Services 标准:CXF 支持多种 Web Services 标准,包含 SOAP、Basic Profile、WS-Addressing、WS-Policy、WS-ReliableMessaging 和 WS-Security。
Frontends:CXF 支持多种“Frontend”编程模型,CXF 实现了JAX-WS API (遵循 JAX-WS 2.0 TCK 版本),它也包含一个“simple frontend”允许客户端和 EndPoint 的创建,而不需要 Annotation 注解。CXF 既支持 WSDL优先开发,也支持从 Java 的代码优先开发模式。
容易使用: CXF 设计得更加直观与容易使用。有大量简单的 API 用来快速地构建代码优先的 Services,各种 Maven 的插件也使集成更加容易,支持 JAX-WS API ,支持 Spring 2.0 更加简化的 XML 配置方式,等等。
支持二进制和遗留协议:CXF 的设计是一种可插拨的架构,既可以支持 XML ,也可以支持非 XML 的类型绑定,比如:JSON 和 CORBA。
项目目标:
下面列出了来自 Apache CXF 官方网站的项目目标。
概要
高性能
可扩展
简单且容易使用
支持多种标准
支持 JAX-WS、 JAX-WSA、JSR-181 和 SAAJ;
支持 SOAP 1.1、1.2、WS-I BasicProfile、WS-Security、WS-Addressing、WS-RM 和 WS-Policy;
支持 WSDL 1.1 、2.0;
支持 MTOM;
多种传输方式、Bindings、Data Bindings 和 Format
Bindings:SOAP、REST/HTTP;
Data Bndings:目前支持 JAXB 2.0、Aegis 两种,默认是 JAXB 2.0。XMLBeans、Castor 和 JiBX 数据绑定方式将在 CXF 2.1 版本中得到支持;
格式(Format):XML、JSON;
传输方式:HTTP、Servlet、JMS 和 Jabber;
可扩展的 API 允许为 CXF 增加其它的 Bindings,以能够支持其它的消息格式,比如:CSV 和固定记录长度。
项目特点:
灵活部署
轻量级容器:可在 Tomcat 或基于 Spring 的容器中部署 Services;
集成 JBI:可以在如 ServiceMix, OpenESB or Petals 等等的 JBI 容器中将它部署为一个服务引擎;
集成 SCA:可以部署在如 Tuscany 之类的 SCA 容器中;
集成 J2EE:可以在 J2EE 应用服务器中部署 Services,比如:Geronimo、JOnAS、JBoss、WebSphere Application Server 和 WebLogic Application Server,以及 Jetty 和 Tomcat;
独立的 Java 客户端/服务器。
支持多种编程语言
全面支持 JAX-WS 2.0 客户端/服务器编程模型;
支持 JAX-WS 2.0 synchronous、asynchronous 和 one-way API’s;
支持 JAX-WS 2.0 Dynamic Invocation Interface (DII) API;
支持 wrapped and non-wrapped 风格;
支持 XML messaging API;
支持 JavaScript 和 ECMAScript 4 XML (E4X) ,客户端与服务端均支持;
通过 Yoko 支持 CORBA;
通过 Tuscany 支持 SCA;
通过 ServiceMix 支持 JBI ;
代码生成
Java to WSDL;
WSDL to Java;
XSD to WSDL;
WSDL to XML;
WSDL to SOAP;
WSDL to Service;
(来自百度百科)

二、CXF开发WebService代码实现

1、普通java项目代码实现

服务端开发:
(1)导入jar包。
maven导入:

<!-- cxf需要的jar包 --><dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-core</artifactId><version>3.0.2</version></dependency><dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-bindings-soap</artifactId><version>3.0.2</version></dependency><dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-databinding-jaxb</artifactId><version>3.0.2</version></dependency><dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-frontend-jaxws</artifactId><version>3.0.2</version></dependency><dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-frontend-simple</artifactId><version>3.0.2</version></dependency><dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-transports-http</artifactId><version>3.0.2</version></dependency><dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-transports-udp</artifactId><version>3.0.2</version></dependency><dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-ws-addr</artifactId><version>3.0.2</version></dependency><dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-wsdl</artifactId><version>3.0.2</version></dependency><dependency><groupId>org.apache.neethi</groupId><artifactId>neethi</artifactId><version>3.0.3</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.7</version></dependency><dependency><groupId>org.codehaus.woodstox</groupId><artifactId>stax2-api</artifactId><version>3.1.4</version></dependency><dependency><groupId>org.codehaus.woodstox</groupId><artifactId>woodstox-core-asl</artifactId><version>4.4.1</version></dependency><dependency><groupId>wsdl4j</groupId><artifactId>wsdl4j</artifactId><version>1.6.3</version></dependency><dependency><groupId>org.apache.wss4j</groupId><artifactId>wss4j-bindings</artifactId><version>2.0.2</version></dependency><dependency><groupId>org.apache.ws.xmlschema</groupId><artifactId>xmlschema-core</artifactId><version>2.1.0</version></dependency><dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-transports-http-jetty</artifactId><version>3.0.2</version></dependency>

手动导入:
可以去Apache CXF 官方网站下载CXF框架的安装包。CXF 框架目前的最新版本是 3.2.7,下载时请选择“二进制发布包(Binary distribution)”,感兴趣的话可以下载相应版本的“源代码发布包(Source distribution)”。下载后解压,然后配置环境变量 %CXF_HOME%(参照jdk环境变量配置)。jar包在lib目录下。手动导入下面图片中的几个jar包即可。
在这里插入图片描述
(2)创建服务接口SEI(Service Endpoint Interface),以及接口的实现类

这里可以参照我另外一篇关于webservice的博客:https://blog.csdn.net/qq_34609889/article/details/85338253

import javax.jws.WebService;
import javax.xml.ws.BindingType;
import javax.xml.ws.soap.SOAPBinding;import com.dmf.sei.UserService;
/*** * @author dmf* WebService 服务接口SEI(Service Endpoint Interface),在wsdl中就是portType**/
@WebService
//@BindingType(SOAPBinding.SOAP12HTTP_BINDING)
public interface UserService {public String saveUserInfo(String name,int age);public String getUserInfoById(String id);
}
@WebService    //@WebService注解表示该类是一个服务类,需要发布其中的public的方法
public class UserServiceImpl implements UserService{@Overridepublic String saveUserInfo(String name, int age) {System.out.println("姓名:"+name+" 年龄:"+age);return "success";}@Overridepublic String getUserInfoById(String id) {System.out.println("用户id:"+id);return "张三";}}

(3)发布WebService服务

public class UserServicePublish {public static void main(String[] args) {UserService userService=new UserServiceImpl();JaxWsServerFactoryBean bean=new JaxWsServerFactoryBean();//设置WebService服务地址bean.setAddress("http://localhost:9999/UserService");//设置WebService服务接口bean.setServiceClass(UserService.class);//设置WebService服务实现类bean.setServiceBean(userService);//添加输入拦截器  :输入显示日志信息的拦截器//bean.getInInterceptors().add(new LoggingInInterceptor());//添加输出拦截器  :输出显示日志信息的拦截器//bean.getOutInterceptors().add(new LoggingOutInterceptor());bean.create();//发布webserviceSystem.out.println("webservice成功发布!");}
}

(4)测试WebService服务是否发布成功
在浏览器地址栏输入http://localhost:9999/UserService?wsdl。

在这里插入图片描述
(5)发布SOAP1.2的服务端
SOAP(简单对象访问协议)有1.1和1.2两个版本。使用最多的是1.1版本。如果想要发布SOAP1.2服务端,需要在接口上添加注解 @BindingType(SOAPBinding.SOAP12HTTP_BINDING)(接口注释部分)。
客户端开发
(1)生成代码,导入jar包。
上文我们说了怎么安装cxf框架,这里需要用到bin目录下的wsdl2java工具生成客户端代码,和jdk的wsimport工具类似。它的命令是wsdl2java。wsdl2java的常用参数:
-d,指定输出目录
-p,指定包名,如果不指定该参数,默认包名是WSDL的命名空间的倒序 。
Wsdl2java支持SOAP1.1和SOAP1.2。命令示例:
wsdl2java -d . http://localhost:9999/UserService?wsdl
.代表在当前目录生成代码
导入cxf需要的jar包
(2)编写测试类

public class CXFWebServiceClient {public static void main(String[] args) {//方法1/*UserServiceService service = new UserServiceService();UserService userService = service.getUserServicePort();String name = userService.getUserInfoById("123");System.out.println("根据id获取到的用户姓名为:"+name);*///方法2JaxWsProxyFactoryBean jaxWsProxyFactoryBean=new JaxWsProxyFactoryBean();//设置服务接口jaxWsProxyFactoryBean.setServiceClass(UserService.class); //设置服务地址jaxWsProxyFactoryBean.setAddress("http://localhost:9999/UserService");//获取服务接口实例UserService userService=(UserService) jaxWsProxyFactoryBean.create();//调用方法String name = userService.getUserInfoById("123");System.out.println("根据id获取到的用户姓名为:"+name);}

2、CXF+Spring开发WebService

客户端开发
(1)导入Spring的依赖包。
maven导入:

<!-- Spring 依赖包 --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.0.5.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>4.0.5.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>4.0.5.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>4.0.5.RELEASE</version></dependency>

手动导入:
导入下列几个jar包即可
在这里插入图片描述
(2)创建SEI接口以及接口实现类(和普通java项目代码实现那节相同即可,这里就不复述了)。
(3)配置spring配置文件application.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"xmlns:jaxws="http://cxf.apache.org/jaxws"xsi:schemaLocation="  
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd  
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd  
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd  
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"><bean id="userServiceImpl" class="com.dmf.sei.impl.UserServiceImpl"/><!--jaxws:server发布SOAP协议的服务 ,对JaxWsServerFactoryBean类封装--><!--serviceClass属性是服务接口,address代表地址,serviceBean是服务实现类。--><!--如果是web项目,address可以只配置服务名,例如 :/UserService。那么WebService访问地址就是http://ip:web项目端口/项目名/ws/UserService?wsdl--><jaxws:server address="http://localhost:9999/UserService" serviceClass="com.dmf.sei.UserService"><jaxws:serviceBean><ref bean="userServiceImpl" /></jaxws:serviceBean><!-- 配置输入显示日志信息的拦截器,可以省略 --><jaxws:inInterceptors><bean class="org.apache.cxf.interceptor.LoggingInInterceptor"></bean></jaxws:inInterceptors><jaxws:outInterceptors><bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"></bean></jaxws:outInterceptors></jaxws:server>
</beans>  

在这里插入图片描述
(4)发布WebService服务。

public class CXFSpringServicePublish {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");System.out.println("webService启动成功!");}}

客户端开发
(1)导入Spring的依赖jar包,以及使用wsdl2java生成客户端代码。
(2)配置spring的配置文件,application.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"xmlns:jaxws="http://cxf.apache.org/jaxws"xsi:schemaLocation="  
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd  
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd  
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd  
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"><!-- <jaxws:client实现客户端 ,对JaxWsProxyFactoryBean类封装-->   <!-- address是服务地址,servicelass是服务接口,返回服务实现类-->   <jaxws:client id="userService" address="http://localhost:9999/UserService" serviceClass="com.dmf.sei.UserService"/>
</beans>

(3)客户端调用服务

public class CXFSpringClient {public static void main(String[] args) {ApplicationContext ctx = new ClassPathXmlApplicationContext("application.xml");UserService userService = (UserService) ctx.getBean("userService");// 调用方法String name = userService.getUserInfoById("123");System.out.println("根据id获取到的用户姓名为:" + name);}}

web项目的CXF对应配置
服务端:
application.xml中jaxws:server标签的address可以配置为/UserService,无需加上ip端口,如果写了ip端口,则客户端按照这个配置来调用。

<jaxws:server address="/UserService" serviceClass="com.dmf.sei.UserService">

web.xml文件配置:

<!--配置Tomcat启动时加载Spring配置文件  --><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:application.xml</param-value></context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><!--配置CXF提供的Servlet  --><servlet><servlet-name>CXF</servlet-name><servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class></servlet><servlet-mapping><servlet-name>CXF</servlet-name><url-pattern>/ws/*</url-pattern></servlet-mapping>

那么WebService访问地址就是http://ip:web项目端口/项目名/ws/UserService?wsdl
客户端:
application.xml中jaxws:client标签的address配置为:

<jaxws:client id="userService" address="http://localhost:8080/CXFWebServiceServer/ws/UserService" 
serviceClass="com.dmf.sei.UserService"/>

http://chatgpt.dhexx.cn/article/4haYO034.shtml

相关文章

SpringBoot2 整合 CXF 服务端和客户端

文章目录 一、CXF服务端1. 导入依赖2. 创建service接口3. 接口实现类4. cxf配置类5. 查看wsdl结果 二、CXF客户端2.1. 客户端2.2. 断点调试2.3. 发起调用服务开源源码. 一、CXF服务端 1. 导入依赖 <properties><cxf.version>3.3.1</cxf.version></proper…

CXF客户端乱码

CXF客户端乱码 解决办法一&#xff0c;设置服务端代码&#xff1a; 在使用CXF与其他系统对接时&#xff0c;发现对方系统响应的汉字乱码&#xff0c;使用soapui调用测试就没有问题&#xff0c;但是程序里面调用就乱码&#xff0c;很奇怪&#xff0c;乱码如下&#xff1a; 由…

SpringBoot集成CXF

CXF入门篇https://blog.csdn.net/tongxin_tongmeng/article/details/126482362Server端项目结构 Server端pom.xml <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation"…

走进cxf

一、什么是cxf 有很多人认为cxf就是webservice&#xff0c;其实cxf只是发布调用webservice的工具而已 Apache CXF Celtix Xfire&#xff0c;开始叫 Apache CeltiXfire&#xff0c;后来更名为 Apache CXF 了&#xff0c;以下简称为 CXF。Apache CXF 是一个开源的 web Service…

NewSQL ---- Mysql.8.0 与 MemSQL 7.0 大数据量查询性能对比

目录 1测试环境以及测试用例设计 1.1测试环境 1.2测试用例设计 2 千万级数据量性能测试对比 2.1 MemSQL时间范围分页查询 2.1.1 性能测试数据 2.2任务信息查询 2.2.1 性能测试数据 2.3 执行批次范围查询 2.3.1 性能测试数据 2.4 批次任务查询 2.4.1 性能测试数据 …

memsql架构2

接上次的MemSQL分布式架构介绍(一)&#xff0c;原文在这里&#xff1a;http://docs.memsql.com/latest/concepts/distributed_architecture/ 首先上张图&#xff0c;是我根据自己的理解画的&#xff0c;如有错误还请大家指出 几个概念 1、MemSQL有两种类型的表&#xff1a; ref…

MemSQL性能测试结果

1.查询的SQL select count(subie.user_id) as count from sum_user_basic_info_exp subie join sum_user_lend_info_exp sulie on sulie.user_idsubie.user_id where subie.curr_user_role_cd1 and subie.reg_dt >2016-08-29 and subie.reg_dt <2016-08-29 结…

【MySQL】SQL优化

SQL优化 1 插入数据 1.1 insert优化 如果我们需要一次性往数据库表中插入多条记录&#xff0c;可以从以下三个方面进行优化。 insert into tb_test values(1,tom); insert into tb_test values(2,cat); insert into tb_test values(3,jerry); .....1.批量插入数据 Insert…

MySQL慢SQL探究

文章目录 前言1、慢SQL捕获慢查询追踪配置方式 2、情况分析为什么查询会慢&#xff1f; 2.1 SQL执行计划分析explain执行计划分析PROFILE分析OPTIMIZER_TRACE分析 3、引擎参数配置分析I/O性能分析MySQL I/O参数 其他原因分析网络抖动单表数据量过大 总结 前言 我们在日常开发中…

【Mysql】SQL性能分析

【Mysql】SQL性能分析 文章目录 【Mysql】SQL性能分析1. SQL执行频率2. 慢查询日志3. profile详情4. explain 1. SQL执行频率 在控制台中通过命令 show [session|global] status 命令可以提供服务器状态信息。通过如下指令&#xff0c;可以查看当前数据库的 insert,update,del…

MemSQL可以为时间序列应用做些什么

版权声明&#xff1a;本文由腾讯云数据库产品团队整理&#xff0c;页面原始内容来自于db weekly英文官网&#xff0c;若转载请注明出处。翻译目的在于传递更多全球最新数据库领域相关信息&#xff0c;并不意味着腾讯云数据库产品团队赞同其观点或证实其内容的真实性。如果其他媒…

MySQL-SQL优化

文章目录 一、插入数据1、insert2、大批量插入数据 二、主键优化&#xff08;1&#xff09;数据组织方式&#xff08;2&#xff09;页分裂&#xff08;3&#xff09;页合并&#xff08;4&#xff09;索引设计原则 三、order by优化四、group by优化五、limit优化六、count优化1…

每秒1.28万亿行,最快的分布式关系数据库MemSQL又破记录了!

众所周知&#xff0c;如果交互式响应时间小于四分之一秒&#xff0c;那么人们会获得令人难以置信的满意度。当你提供的响应时间下降到大约四分之一秒时&#xff0c;交互对用户而言是即时的。 但是&#xff0c;由于大数据集和并发需求&#xff0c;给所有客户提供的速度水平似乎…

速度最快的数据库---MEMSQL的安装与部署

1. 什么是MEMSQL 前Facebook工程师创办的MemSQL公司获500万美元投资。号称世界上最快的分布式关系型数据库&#xff0c;兼容MySQL但快30倍&#xff0c;能实现每秒150万次事务。原理是仅用内存并将SQL预编译为C。2012年12月14&#xff0c;MemSQL 1.8 发布&#xff0c;号称最快的…

memsql-官宣世界最快的内存关系型数据库安装部署

官网地址&#xff1a;https://www.memsql.com/ 获取到的license:BGNhZmY4YjViM2Y1OTRhOTdiOTNlNTE0NmU3MGJhN2NlAAAAAAAAAAAEAAAAAAAAAAwwNAIYJLLETZcXn8NHKfJAS/Iai5hUjzaCMQ5PAhht2vDZAS1q1a49DPsq5gMGKY9AI0wmaSkAAA 1&#xff0c;memsql官网介绍 MemSQL 是一个分布式关系数…

memSQL简介

前言 由前Facebook工程师创办的MemSQL&#xff0c;号称世界上最快的分布式关系型数据库&#xff0c;兼容MySQL但快30倍&#xff0c;能实现每秒150万次事务。原理是仅用内存并将SQL预编译为C。 MemSQL 提供免费的开发者版本&#xff08;数据限制32G&#xff09;和全功能试用版…

统一异常处理解决方案

&#x1f481; 作者&#xff1a;小瓦匠 &#x1f496; 欢迎关注我的个人公众号&#xff1a;小瓦匠学编程。微信号&#xff1a;xiaowajiangxbc &#x1f4e2; 本中涉及到的所有代码资源&#xff0c;可以在公众号中获取&#xff0c;关注并回复&#xff1a;源码下载 &#x1f449;…

SpringBoot统一异常处理详解

文章目录 一、概述1、统一异常处理介绍2、原理和目标 二、Assert(断言)1、概述2、Assert自定义实战2.1 自定义接口Assert2.2 自定义异常2.3 Enum整合2.4 实战检测 三、统一异常处理器1、异常处理器说明1.1 handleServletException1.2 handleBindException和handleValidExceptio…

Shell 异常处理

原创&#xff1a;转载请注明出处 #!/bin/bash ##################服务器执行以下脚本############################# ## 重新上传脚本到服务器 -> 部署启动的脚本#当任何一行的命令执行错误的时候&#xff08;比如命令写错了&#xff09;直接退出&#xff0c;不继续往下执行…

java中的统一异常处理

目录 统一异常处理的原因 如果进行统一异常处理 1、编写统一异常处理类与方法 2、编写自定义异常类 3、定义异常枚举类 4、抛出指定异常 小提醒 统一异常处理的原因 在我们写代码的时候&#xff0c;因为各种场景需要进行各种校验&#xff0c;我们就可能会进行多种响应&…