深入浅出搞懂 Apache CXF 框架

Web服务是系统与系统之间通信的重要方式。本文将结合Apache CXF和Spring,详细讲解如何创建和配置Web服务,并给出具体的示例,帮助读者快速上手。

什么是Web服务?

Web服务是一种允许不同应用程序通过网络进行互操作的技术,特别是在不同的平台或编程语言之间。Web服务可以被远程客户端调用,提供了一种标准的方式来处理跨系统的数据交换。

Apache CXF框架

Apache CXF是一个强大且灵活的框架,旨在简化Web服务的创建和使用。它支持多种Web服务标准,包括SOAP和RESTful API,使得开发人员能够快速构建可重用的服务。

创建Web服务

1. 使用@WebService注解

要将某个类标记为Web服务接口,您需要使用@WebService注解。此注解标识该类可能被远程客户端调用。需要注意的是,@WebService注解需要在JDK 1.6及以上版本中使用。

import javax.jws.WebService;@WebService
public interface UserService {String getUserName(String userId);
}

2. 实现接口

接下来,您需要创建接口的实现类:

public class UserServiceImpl implements UserService {@Overridepublic String getUserName(String userId) {// 模拟获取用户的逻辑return "UserName for " + userId;}
}

3. 发布Web服务

现在,我们将使用JaxWsServerFactoryBean创建和发布Web服务。在main方法中,我们将执行以下步骤:

import org.apache.cxf.jaxws.JaxWsServerFactoryBean;public class ServerDemo {public static void main(String[] args) {// 1. 创建工厂对象JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();// 2. 设置参数// 2.1 设置访问地址(让客户端访问)factory.setAddress("http://localhost:8888/userservice");// 2.2 设置接口类型factory.setServiceClass(UserService.class);// 2.3 设置实现类对象factory.setServiceBean(new UserServiceImpl());// 3. 发布接口(阻塞方式)factory.create();System.out.println("Webservice服务程序发布成功…");}
}

在这个示例中,我们完成了Web服务的发布。服务将侦听 http://localhost:8888/userservice 地址,客户端可以通过这个地址访问服务。

4. 开发客户端

在Web服务发布后,您需要开发客户端代码来调用这个服务。客户端的代码可能如下:

import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import java.net.URL;public class ClientDemo {public static void main(String[] args) throws Exception {// 定义服务的WSDL地址URL url = new URL("http://localhost:8888/userservice?wsdl");// 创建服务名称和服务QName qname = new QName("http://impl.service.example.com/", "UserServiceImplService");Service service = Service.create(url, qname);// 获取远程接口的代理UserService userService = service.getPort(UserService.class);// 调用远程方法String userName = userService.getUserName("123");System.out.println("获取到的用户名称: " + userName);}
}

在这个示例中,客户端使用指定的WSDL地址来查找服务,并获取代理对象,然后调用方法 getUserName

5. Spring整合JAX-WS开发

为了更好地管理Web服务的生命周期,通常会将Web服务与Spring框架集成。接下来,我们将结合Spring Boot和Apache CXF来实现一个Web服务。

5.1 CxfConfig 类

下面是一个典型的Spring配置类 CxfConfig,它配置了Apache CXF Web服务:

package com.xxx.config;import javax.xml.ws.Endpoint;
import org.apache.cxf.Bus;
import org.apache.cxf.bus.spring.SpringBus;
import org.apache.cxf.jaxws.EndpointImpl;
import org.apache.cxf.transport.servlet.CXFServlet;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.XXX.server.AddrServer;
import lombok.RequiredArgsConstructor;@Configuration
@RequiredArgsConstructor
public class CxfConfig {private final AddrServer addrServer;@Beanpublic ServletRegistrationBean<CXFServlet> cxfServlet() {return new ServletRegistrationBean<CXFServlet>(new CXFServlet(), "/webservice/*");}@Bean(name = Bus.DEFAULT_BUS_ID)public SpringBus springBus() {return new SpringBus();}@Beanpublic Endpoint endpoint() {EndpointImpl endpoint = new EndpointImpl(springBus(), addrServer);endpoint.publish("/addr");return endpoint;}
}

5.2 CxfConfig 类的详细解析

  • Servlet的注册:通过 cxfServlet 方法注册了CXF的Servlet。当浏览器或客户端访问 /webservice/* 时,CXFServlet将处理这些请求。

  • 创建SpringBus:通过 springBus 方法创建并配置CXF的Bus。Bus 是CXF的核心,用于管理服务和请求。

  • 发布Web服务:在 endpoint 方法中,我们创建并发布了一个Web服务端点。使用 addrServer 作为实现类,通过 endpoint.publish("/addr") 暴露服务。

6. 整体工作流程

结合上面的内容,我们可以总结出Web服务的整体工作流程:

  1. 定义接口:使用@WebService注解标识接口,定义需要提供的服务方法。

  2. 实现业务逻辑:创建实现类实现接口中的方法,编写具体的业务逻辑。

  3. 发布Web服务:通过 JaxWsServerFactoryBean 在特定地址上发布Web服务。

  4. 开发客户端:使用SOAP方式调用远程Web服务的方法,获取返回结果。

  5. 整合Spring:在Spring环境下配置Web服务,使得服务的管理更为简单高效。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/51435.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sql注入详解【从数据库架构分析】

简介 SQL注入是一种常见的Web应用程序安全漏洞&#xff0c;它允许攻击者在Web应用程序中插入恶意SQL语句&#xff0c;从而操纵数据库执行非授权的操作。这种攻击利用了应用程序在处理用户输入时的不足&#xff0c;特别是当应用程序直接将用户输入作为SQL语句的一部分使用&…

Flutter Screenshot使用指南:轻松捕获Widget为图片

Flutter Screenshot使用指南&#xff1a;轻松捕获Widget为图片 简介 screenshot 是一个Flutter插件&#xff0c;它提供了一个简单的方法来捕获任何Widget为图片&#xff0c;包括那些未渲染在屏幕上的Widget。 主要功能 捕获屏幕上的Widget为图片。支持捕获不可见的Widget&a…

聊聊基于Alink库的特征工程方法

独热编码 OneHotEncoder 是用于将类别型特征转换为独热编码的类。独热编码是一种常用的特征编码方式&#xff0c;特别适用于处理类别型特征&#xff0c;将其转换为数值型特征。 对于每个类别型特征&#xff0c;OneHotEncoder 将其编码成一个长度为类别数量的向量。 每个类别对…

数据库实验:SQL Server基本表单表查询

一、实验目的&#xff1a; 1、掌握使用SQL语法实现单表查询 二、实验内容&#xff1a; 1. 查询订购日期为2001年5月22日的订单情况。&#xff08;Orders&#xff09;&#xff08;时间日期的表达方式为 dOrderDate ‘2001-5-22’&#xff0c;类似字符串&#xff0c;使用单引号…

Python爬虫技术 第20节 模拟用户交互

Python爬虫技术是一种自动化获取网页数据的方法。模拟用户交互是其中的一个高级主题&#xff0c;通常用于处理那些需要用户输入、点击按钮或者执行其他交互操作才能加载数据的动态网站。 下面我会分步骤介绍如何使用Python来模拟这些用户交互&#xff1a; 1. 基础爬虫知识 在…

vue的虚拟Dom和diff算法

什么是虚拟dom&#xff1a; 虚拟 DOM 是一个抽象的虚拟树结构&#xff0c;用于表示页面的结构和内容&#xff0c;但它并不直接与实际的浏览器 DOM 交互。当响应式数据变化时&#xff0c;Vue 会生成一个新的虚拟 DOM 树&#xff0c;表示更新后的页面状态&#xff0c;再通过diff…

NumpyPandas:Pandas库(50%-100%)

目录 前言 一、排序 1.使用索引排序 2.使用变量值排序 二、计算新变量 1.新变量为常量 2.根据原变量新增列 3.基于一个原变量做函数运算 4.在指定位置插入新列 三、修改替换变量值 1.对应数值替换 2.指定范围替换 四、虚拟变量变换 五、数值变量分组 六、数据分组…

ChatGPT:@JSONField 有什么用

ChatGPT&#xff1a;JSONField 有什么用 JSONField 注解在使用 Fastjson 进行 JSON 序列化和反序列化时&#xff0c;提供了以下主要功能&#xff1a; 字段别名&#xff1a; 你可以使用 JSONField 注解指定 JSON 字符串中字段的名称。如果 Java 对象的字段名与 JSON 字符串中的…

构建大规模账号池与本地部署:GitHub爬虫项目详解

账号池搭建 必要性 常见登录方式&#xff1a; 基于Session Cookie的登录基于JWT的登录&#xff1a;登录生成JWT字符串 账号池存储cookie或者JWT字符串 方便后续发请求爬取数据 本地部署 conda建立一个虚拟环境 conda create -n new_env python3.x # 替换 x 为你需要的 P…

Python3网络爬虫开发实战(7)JavaScript 动态渲染页面爬取

文章目录 一、Selenium1. 基本安装2. 基本使用3. 声明浏览器对象4. 访问页面5. 查找节点6. 节点交互7. 动作链8. 执行 JavaScript9. 获取节点信息10. 切换 Frame11. 延时等待12. 前进后退13. Cookies14. 选项卡管理15. 异常处理16. 反屏蔽17. 无头模式18. Pyppeteer&#xff0c…

80后最后的书信 年代

当时11亿人口只有1.8万部固定电话 中国几千年来 鱼传尺素 雁寄鸿书 写信最后要写 亲啓 如有照片&#xff0c;封面要写内有照片&#xff0c;请勿折叠 信的开头应该是 见字如面&#xff0c;展信舒颜 如果拜托别人做事情&#xff0c;最后要写为盼 最后要写 某某草 书未尽…

ubuntu 配置opencv-python-imsow()报错

python调用imshow&#xff08;&#xff09;时出现下面的错误&#xff1a; error: (-2:Unspecified error) The function is not implemented. Rebuild the library with Windows, GTK 2.x or Cocoa support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-c…

Python --Pandas库基础方法(1)

文章目录 Pandas主要数据结构Pandas 的安装Series对象创建使用列表创建调取值与索引指定index字典创建标量与index对象一起传入创建 DataFrame对象创建创建DataFrame对象values、index、columns属性列表创建索引columns的使用 Pandas中的Index导入csv文件指定列名指明分隔符读取…

关于黑马Ajax项目的笔记

一、token的介绍 概念&#xff1a; 访问权限的令牌&#xff0c;本质上是一串字符串 创建&#xff1a; 正确登录后&#xff0c;由后端签发并返回 作用&#xff1a; 判断是否有登录状态等&#xff0c;控制访问权限 注意 前端只能判断token有无&#xff0c;后端才能判断to…

复制带有随机指针的链表(通过复制链表实现)

public static Node copyListWithRand2(Node head){ // 如果头节点为空&#xff0c;直接返回null if(head null){ return null; } // 初始化当前节点和下一个节点 Node cur head; Node next null; // 遍历链表&#xff0c;复制每个节点&#xf…

大厂面经:京东大数据面试题及参考答案(3万字长文)

目录 Hive窗口函数有什么,什么场景,怎么用 Hive文本拼接函数是什么 Hive的数据存储格式有哪些,优缺点 两个表 join 过程中,空值的情况如何处理? Hive存储结构的区别? Hive本身对于SQL做了哪些优化? Hive分区和分桶区别? Hive分桶表的作用? HBase负载均衡怎么…

智能番茄新鲜度检测系统:基于深度学习的全面实现

基于深度学习的番茄新鲜度检测系统&#xff08;UI界面YOLOv8/v7/v6/v5代码训练数据集&#xff09; 引言 番茄是全球广泛种植和消费的蔬菜之一&#xff0c;其新鲜度直接影响其营养价值和口感。传统的番茄新鲜度检测主要依赖于人工观察和经验判断&#xff0c;这不仅费时费力&am…

PHP多功能投票系统源码小程序

&#x1f389;决策不再难&#xff01;「多功能投票小程序」一键搞定所有选择困难症✨ &#x1f914;选择困难&#xff1f;「多功能投票小程序」来救场&#xff01; 每次聚会、团队讨论还是日常小决策&#xff0c;是不是总有那么几个瞬间让你陷入“选哪个好呢&#xff1f;”的…

自动控制:带死区的PID控制算法

带死区的PID控制算法 在计算机控制系统中&#xff0c;为了避免控制动作过于频繁&#xff0c;消除因频繁动作所引起的振荡&#xff0c;可采用带死区的PID控制。带死区的PID控制通过引入一个死区&#xff0c;使得在误差较小的范围内不进行控制动作&#xff0c;从而减少控制系统的…

将nvim的配置 上传gitee

首先是创建仓库 接着进入这个界面 然后是上传代码&#xff0c; 结果&#xff1a; 可以看到已经是可以了。 然后是 拉取代码进行测试。 第一次 拉取 使用 git clone .&#xff08;家里&#xff09; 做一点修改&#xff0c;然后上传。&#xff08;公司&#xff09; 然后在git pu…