CXF WebService SpringBoot 添加拦截器,处理响应报文格式
描述
XFIRE升级CXF框架,但是对接的系统不做调整,这时候就要保证参数报文和响应报文和以前是一致的。但是不同的框架有不同的规则,想要将报文调整的一致,就需要用到拦截器拦截报文,自定义解析处理。
CXF框架本身就是支持配置自定义拦截器的,以下是案例。
响应拦截器案例
package com.xinyuan.model.thirdparty.cxf.interceptor;
import org.apache.cxf.interceptor.AttachmentOutInterceptor;
import org.apache.cxf.io.CachedOutputStream;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.OutputStream;
import java.io.StringReader;
import java.io.StringWriter;public class NamespacePrefixInterceptor extends AbstractPhaseInterceptor<Message> {public NamespacePrefixInterceptor() {// 在发送消息之前的阶段进行拦截super(Phase.PRE_STREAM);// 添加依赖的拦截器addAfter(AttachmentOutInterceptor.class.getName());}@Overridepublic void handleMessage(Message message) {try {// 获取输出流OutputStream outputStream = message.getContent(OutputStream.class);if (outputStream == null) {return;}// 使用 CachedOutputStream 缓存输出流,以便我们可以读取和修改它CachedOutputStream cachedOutputStream = new CachedOutputStream();message.setContent(OutputStream.class, cachedOutputStream);// 在拦截器处理完毕后,将缓存的输出流写回到原始输出流中message.getInterceptorChain().doIntercept(message);// 读取缓存的输出流内容try (CachedOutputStream cos = cachedOutputStream) {String response = new String(cos.getBytes());// 在这里对 response 进行处理String modifiedResponse = processResponse(response);// 将处理后的内容写回到输出流中try (OutputStream finalOutputStream = outputStream) {finalOutputStream.write(modifiedResponse.getBytes());}}} catch (Exception e) {e.printStackTrace();}}private String processResponse(String response) {//在这里写处理报文的逻辑return response;}}
- 在发布接口的代码处,添加拦截器

通过dom的方式解析xml,并为满足条件的元素添加属性
public static void main(String[] args){String xml = "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">\n" +" <soap:Body>\n" +" <ns1:queryGysxxResponse xmlns:ns1=\"http://iface.xt.service.zzxy.com\" xmlns=\"http://entity.service.zzxy.com\">\n" +" <ns1:out>\n" +" <cz>111</cz>\n" +" <dh xsi:nil=\"true\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"/>\n" +" <dzyx xsi:nil=\"true\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"/>\n" +" <frdbmc xsi:nil=\"true\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"/>\n" +" <gsdz xsi:nil=\"true\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"/>\n" +" <gysbh>gysbh</gysbh>\n" +" <gysmc xsi:nil=\"true\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"/>\n" +" <khhmc xsi:nil=\"true\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"/>\n" +" <khhzh xsi:nil=\"true\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"/>\n" +" <lxrmc xsi:nil=\"true\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"/>\n" +" <sj xsi:nil=\"true\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"/>\n" +" <xxdz xsi:nil=\"true\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"/>\n" +" <yzbh xsi:nil=\"true\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"/>\n" +" <zzjgdmh xsi:nil=\"true\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"/>\n" +" </ns1:out>\n" +" </ns1:queryGysxxResponse>\n" +" </soap:Body>\n" +"</soap:Envelope>";try {// 创建DocumentBuilderFactory对象DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();// 设置命名空间感知factory.setNamespaceAware(true);// 创建DocumentBuilder对象DocumentBuilder builder = factory.newDocumentBuilder();// 解析XML字符串Document document = builder.parse(new InputSource(new StringReader(xml)));// 获取<ns1:out>元素NodeList outNodes = document.getElementsByTagNameNS("http://iface.xt.service.zzxy.com", "out");if (outNodes.getLength() > 0) {Element outElement = (Element) outNodes.item(0);// 获取<ns1:out>元素下的所有子节点NodeList childNodes = outElement.getChildNodes();for (int i = 0; i < childNodes.getLength(); i++) {Node childNode = childNodes.item(i);if (childNode.getNodeType() == Node.ELEMENT_NODE) {// 修改子节点的命名空间//((Element) childNode).setNamespaceURI("http://entity.service.zzxy.com");((Element) childNode).setAttribute("a","http://entity.service.zzxy.com");}}}// 输出修改后的XMLTransformerFactory transformerFactory = TransformerFactory.newInstance();Transformer transformer = transformerFactory.newTransformer();DOMSource source = new DOMSource(document);StreamResult result = new StreamResult(System.out);transformer.transform(source, result);} catch (Exception e) {e.printStackTrace();}}
dom4j的方式解析xml,对满足条件的元素添加命名空间
public static void main(String[] args) throws DocumentException {String xml = "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">\n" +" <soap:Body>\n" +" <ns1:queryGysxxResponse xmlns:ns1=\"http://iface.xt.service.zzxy.com\" xmlns=\"http://entity.service.zzxy.com\">\n" +" <ns1:out>\n" +" <cz>111</cz>\n" +" <dh xsi:nil=\"true\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"/>\n" +" <dzyx xsi:nil=\"true\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"/>\n" +" <frdbmc xsi:nil=\"true\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"/>\n" +" <gsdz xsi:nil=\"true\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"/>\n" +" <gysbh>gysbh</gysbh>\n" +" <gysmc xsi:nil=\"true\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"/>\n" +" <khhmc xsi:nil=\"true\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"/>\n" +" <khhzh xsi:nil=\"true\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"/>\n" +" <lxrmc xsi:nil=\"true\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"/>\n" +" <sj xsi:nil=\"true\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"/>\n" +" <xxdz xsi:nil=\"true\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"/>\n" +" <yzbh xsi:nil=\"true\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"/>\n" +" <zzjgdmh xsi:nil=\"true\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"/>\n" +" </ns1:out>\n" +" </ns1:queryGysxxResponse>\n" +" </soap:Body>\n" +"</soap:Envelope>";try {SAXReader reader = new SAXReader();Document document = reader.read(new StringReader(xml));Element root = document.getRootElement();//printElementNames(root);//查找 <ns1:out> 元素Element ns1OutElement = root.element("Body").element("queryGysxxResponse").element("out");// 打印所有的元素名称printElementNames(ns1OutElement);setNamespaceForChildElements(ns1OutElement);} catch (DocumentException e) {e.printStackTrace();}}private static void setNamespaceForChildElements(Element element) {// 创建目标命名空间Namespace targetNamespace = new Namespace("", "http://entity.service.zzxy.com");// 遍历当前元素的所有子元素for (Object child : element.elements()) {if (child instanceof Element) {Element childElement = (Element) child;// 将子元素的 QName 更新为目标命名空间QName newQName = new QName(childElement.getName(), targetNamespace);childElement.setQName(newQName);}}}private static void printElementNames(Element element) {// 打印当前元素的名称System.out.println(element.getName());// 递归打印子元素的名称for (Object child : element.elements()) {if (child instanceof Element) {printElementNames((Element) child);}}
}
相关文章:
CXF WebService SpringBoot 添加拦截器,处理响应报文格式
描述 XFIRE升级CXF框架,但是对接的系统不做调整,这时候就要保证参数报文和响应报文和以前是一致的。但是不同的框架有不同的规则,想要将报文调整的一致,就需要用到拦截器拦截报文,自定义解析处理。 CXF框架本身就是支…...
vue iframe进行父子页面通信并切换URL
使用通义千问提问后得到一个很好的示例。 需求是2个项目需要使用同一个面包屑进行跳转,其中一个是iframe所在的项目,另一个需要通过地址访问。通过 window.parent.postMessage ,帮助 <iframe> 内嵌入的子页面和其父页面之间进行跨域通…...
基于Spring Boot的摄影师分享交流社区
一、系统背景与目的 随着摄影技术的不断发展和摄影爱好者群体的日益扩大,摄影师们需要一个能够展示自己作品、分享摄影心得、交流摄影技巧的平台。基于Spring Boot的摄影师分享交流社区应运而生,它旨在满足摄影师们的这些需求,促进摄影文化的…...
Web 毕设篇-适合小白、初级入门练手的 Spring Boot Web 毕业设计项目:电影院后台管理系统(前后端源码 + 数据库 sql 脚本)
🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 项目介绍 2.0 用户登录功能 3.0 用户管理功能 4.0 影院管理功能 5.0 电影管理功能 6.0 影厅管理功能 7.0 电影排片管理功能 8.0 用户评论管理功能 9.0 用户购票功…...
Linux(网络协议和管理)
后面也会持续更新,学到新东西会在其中补充。 建议按顺序食用,欢迎批评或者交流! 缺什么东西欢迎评论!我都会及时修改的! 在这里真的很感谢这位老师的教学视频让迷茫的我找到了很好的学习视频 王晓春老师的个人空间…...
C++ 入门第 20 天:STL 容器之无序集合与无序多重集合
往期回顾: C 入门17:STL 容器之映射(map)与多重映射(multimap)_-CSDN博客 C 入门18:STL 容器之栈(stack)与队列(queue)-CSDN博客 C 入门19&#x…...
devops-部署Harbor实现私有Docker镜像仓库
文章目录 概述下载配置安装安装后生成的文件使用和维护Harbor参考资料 概述 Harbor是一个开源注册中心,它使用策略和基于角色的访问控制来保护工件,确保镜像被扫描并且没有漏洞,并将镜像签名为可信的。Harbor是CNCF的一个毕业项目࿰…...
rebase ‘A‘ onto ‘master‘ 和 merge ‘master‘ into ‘A‘有什么区别
在Git版本控制系统中,rebase 和 merge 是两种不同的操作,用于合并分支。rebase A onto master 和 merge master into A 虽然最终目的都是将两个分支的更改合并在一起,但它们在处理方式和结果上有所不同。 rebase ‘A’ onto ‘master’ 含义…...
Vulhub:Jackson[漏洞复现]
CVE-2017-7525(Jackson反序列化) 启动漏洞环境 docker-compose up -d 阅读vulhub给出的漏洞文档 cat README.zh-cn.md # Jackson-databind 反序列化漏洞(CVE-2017-7525) Jackson-databind 支持 [Polymorphic Deserialization](https://github.com/Fas…...
strongswan构建测试环境
make-testing脚本文件负责构建strongswan的虚拟化测试系统。位于目录strongswan-5.9.14/testing/,需要以管理员身份运行make-testing。生成测试用到的虚拟客户机镜像,KVM虚拟机和虚拟网络的配置文件位于目录:config/kvm。 ~/strongswan-5.9.14/testing$…...
前端:金额高精度处理
Decimal 是什么 想必大家在用js 处理 数字的 加减乘除的时候,或许都有遇到过 精度不够 的问题,还有那些经典的面试题 0.20.1 ! 0.3, 至于原因,那就是 js 计算底层用的是 IEEE 754 ,精度上有限制, 那么Deci…...
面试题整理3----nc命令的常见用法
面试题整理3----nc命令的常见用法 1. NC是什么2. NC的常用参数2.1 开启指定端口TCP监听(-l小写的L)2.2 测试端口是否能访问(-v)2.3 开启指定端口UDP监听(-u)2.4 端口扫描(-z)2.5 指定超时时间(-w)2.6 指定本地端口号连接(-p)2.7 指定的命令(-e) 1. NC是什么 nc(Net…...
Trimble天宝三维激光扫描仪在建筑工程竣工测量中的应用【沪敖3D】
竣工测量是建筑项目竣工阶段的一个至关重要的环节,它为建筑工程的质量验收和成果核查提供了核心的参考依据。传统的竣工测量方法,如全站仪测量,主要依赖于现场人工操作,存在一些明显的局限性,例如作业时间长、工作量大…...
IntelliJ IDEA 使用技巧与插件推荐
目录 常用使用技巧 1. 使用快捷键提升开发效率 2. 多光标编辑 3. 代码自动补全 4. 使用 Find Action 快速执行操作 5. 集成版本控制系统(VCS) 6. 快速查看代码文档 推荐插件 1. Lombok Plugin 2. Rainbow Brackets 3. Key Promoter X 4. Chec…...
Oracle 技术精选学习
Oracle 技术犹如一座闪耀着无尽光芒的灯塔,为众多 IT 从业者和技术爱好者照亮了前行的道路。无论是数据库管理、企业应用开发还是数据分析,Oracle 都以其强大、稳定和广泛的应用而占据着行业的重要地位。学习 Oracle 技术,更是能为个人带来诸…...
sqlilabs第三十关到第三十五关靶场攻略
第三十关 第三十关和二十九关差不多,将单引号换成双引号 查询表名,字段名,数据 ?id1&id-2" union select 1,group_concat(table_name),3 from information_schema.tables where table_schemadatabase()-- ?id1&id-2" …...
windows免登录linux
windows 生成秘钥文件 ssh-keygen -t rsa 将公钥传送到服务器 scp C:\Users\xx/.ssh/id_rsa.pub xxxx:/home/ruoyi/id_rsa.pub linux 使用ssh-copy-id -i ~/.ssh/id_rsa.pub userhost 如果禁用root登录,先开启 vim /etc/ssh/sshd_config PermitRootLogin yes …...
matlab绘图时设置左、右坐标轴为不同颜色
目录 一、需求描述 二、实现方法 一、需求描述 当图中存在两条曲线,需要对两条曲线进行分别描述时,应设置左、右坐标轴为不同颜色,并设置刻度线,且坐标轴颜色需要和曲线颜色相同。 二、实现方法 1.1、可以实现: 1…...
springboot+javafx使用aop切面导致的fx:id不能被注入问题
记录一个我遇到得问题 问题描述 我本来使用AOP切面来进行全局异常管理,但是使用AOP之后fxml中通过fx:id绑定得参数无法被注入 Slf4j Component Aspect public class GlobalExceptionAspect {AfterThrowing(pointcut "execution(* com.shkj.videoclassifica…...
说说你对java lambda表达式的理解?
大家好,我是锋哥。今天分享关于【说说你对java lambda表达式的理解?】面试题。希望对大家有帮助; 说说你对java lambda表达式的理解? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Java Lambda 表达式是 Java 8 引入的一项重要特性&#…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
使用SSE解决获取状态不一致问题
使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...
书籍“之“字形打印矩阵(8)0609
题目 给定一个矩阵matrix,按照"之"字形的方式打印这个矩阵,例如: 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为:1,…...
【java面试】微服务篇
【java面试】微服务篇 一、总体框架二、Springcloud(一)Springcloud五大组件(二)服务注册和发现1、Eureka2、Nacos (三)负载均衡1、Ribbon负载均衡流程2、Ribbon负载均衡策略3、自定义负载均衡策略4、总结 …...
拟合问题处理
在机器学习中,核心任务通常围绕模型训练和性能提升展开,但你提到的 “优化训练数据解决过拟合” 和 “提升泛化性能解决欠拟合” 需要结合更准确的概念进行梳理。以下是对机器学习核心任务的系统复习和修正: 一、机器学习的核心任务框架 机…...
Linux 内存管理调试分析:ftrace、perf、crash 的系统化使用
Linux 内存管理调试分析:ftrace、perf、crash 的系统化使用 Linux 内核内存管理是构成整个内核性能和系统稳定性的基础,但这一子系统结构复杂,常常有设置失败、性能展示不良、OOM 杀进程等问题。要分析这些问题,需要一套工具化、…...
