使用CXF调用WSDL(二)
简介
本篇文章主要解决了上篇文章中遗留的对象嵌套问题,要想全面解析无限极的对象嵌套需要使用递归去解决
上文链接:
使用CXF调用WSDL(一)
上文回顾
上文使用了单方法“ call() ”解决了List和基本类型(含String)以及对象的解析,但遗留了对象嵌套问题,本文将把 “ call() ” 方法中关于对象解析的部分拆分出独立的方法 “ analysisParam() ”,然后使用递归解决对象的嵌套问题
正文
/*** 调用远程过程*/public Object call(DTGMM1020GERP paramEntity) {Object result = null;log.info("[PO创建时]入参:{}",JSON.toJSONString(paramEntity,true));Map map = JSONObject.parseObject(JSON.toJSONString(paramEntity, SerializerFeature.WriteDateUseDateFormat), Map.class);Map<String,Object> wsdl = getWSDLContent();Client client = (Client) wsdl.get("client");List<MessagePartInfo> partInfos = (List<MessagePartInfo>) wsdl.get("messagePartInfo");QName qName = (QName) wsdl.get("qname");String clazzName = partInfos.get(0).getTypeClass().getName(); try {Object requestParamObject = Thread.currentThread().getContextClassLoader().loadClass(clazzName).newInstance();requestParamObject = analysisParam(requestParamObject,map);log.info("请求参数:{}",JSON.toJSON(requestParamObject));result = client.invoke(qName, requestParamObject);log.info("响应结果:{}",JSON.toJSONString(result,true));} catch (Exception e) {e.printStackTrace();}return result;}
解说:方法 “ call() ” 接收一个 “ DTGMM1020GERP ” 对象作为入参并返回一个Object对象,该方法主要业务就是将入参对象转换成map对象,而后读取WSDL文件内容,并传入给 “ analysisParam() ” 方法解析,其中requestParamObject是读出的WSDL文件的节点,map是待写入节点的值
private static Object analysisParam(Object req, Map map) throws InstantiationException, IllegalAccessException {Field[] fields = req.getClass().getDeclaredFields();for (Field field : fields) {field.setAccessible(true);boolean b = field.getGenericType() instanceof ParameterizedType;//如果是泛型并且是List类型if(b && field.getType() == List.class){List<?> cParam = (List<?>) map.get(field.getName());log.info("子对象参数:{}",cParam);if(CollectionUtils.isEmpty(cParam)){continue;}Type type = ((ParameterizedType)field.getGenericType()).getActualTypeArguments()[0];Class<?> aClass = (Class<?>) type;Object cObj = aClass.newInstance();log.info("子对象:{}",cObj);Field[] cFields = cObj.getClass().getDeclaredFields();for (Field cField : cFields) {cField.setAccessible(true);List<?> target = cParam.stream().map(o -> {Map ccParam = JSONObject.parseObject(JSON.toJSONString(o),Map.class);Object strParam = ccParam.get(cField.getName());//如果子对象类型是基本类型或String类型那就直接赋值,负责就递归if(cField.getType().isPrimitive() || cField.getType() == String.class){try {if(null != strParam){cField.set(cObj,strParam);}} catch (IllegalAccessException e) {throw new RuntimeException(e);}}else{try {Object obj = cField.getType().newInstance();Map objMap = JSONObject.parseObject(JSON.toJSONString(strParam),Map.class);if(!CollectionUtils.isEmpty(objMap)){analysisParam(obj,objMap);cField.set(cObj,obj);}} catch (InstantiationException e) {throw new RuntimeException(e);} catch (IllegalAccessException e) {throw new RuntimeException(e);}}return strParam;}).collect(Collectors.toList());/*Object targetResp = target.get(0);cField.set(cObj,targetResp);*/}List<Object> cObjs = new ArrayList<>();cObjs.add(cObj);//给父对象赋值field.set(req,cObjs);}else if(field.getType().isPrimitive() || field.getType() == String.class){//如果是基本类型或String类型field.set(req,map.get(field.getName()));}else{//按对象处理Object o = field.getType().newInstance();Map childrenObjMap = (Map) map.get(field.getName());if(!CollectionUtils.isEmpty(childrenObjMap)){writeFieldValue(o,childrenObjMap);field.set(req,o);}}}return req;}
步骤解析:
一、使用反射获取待解析节点的字段
二、进行第一层 for 循环解析节点,先判断了字段的类型是否为泛型且为List类型,如果不是泛型且不是List类型,再判断是否为基本类型或是String类型,如果也不是,那就当成普通对象处理
三、如果第一层 for 循环中的类型为泛型且为List类型时,则进行第二层 for 循环处理,第二层循环同样判断子对象字段值是否为基本类型或String类型,如果是则直接赋值,如果不是,则说明是一个对象,至于是个什么对象(List?基本类型?String?POJO?),无需理会,直接进行递归解析即可
注意:map的key需和待解析的节点字段名保持一致,因为map.get()是通过field.getName()取值的
本文中引用到的其他方法请从上一篇文章中获取
使用CXF调用WSDL(一)
完成
文末
这是我mock加数据的方法,入参对象可以使用该方法快速生成mock数据(本文中的DTGMM1020GERP )
public static <T> T getEntityData(T t) {Field[] field = t.getClass().getDeclaredFields();for (Field f : field) {f.setAccessible(true);try {Random random = new Random();int num = random.nextInt(10);f.set(t,""+num);} catch (IllegalAccessException e) {throw new RuntimeException(e);}}return t;}
用法
只需要定义好对象的嵌套层级即可
List<DTGMM1020GERP> list = new ArrayList<>();
DTGMM1020GERP entity = new DTGMM1020GERP();
entity = getEntityData(entity);
list.add(entity);

结束
相关文章:
使用CXF调用WSDL(二)
简介 本篇文章主要解决了上篇文章中遗留的对象嵌套问题,要想全面解析无限极的对象嵌套需要使用递归去解决 上文链接: 使用CXF调用WSDL(一) 上文回顾 上文使用了单方法“ call() ”解决了List和基本类型(含String&…...
list.toArray
直接去看原文 原文链接:List的toArray()方法_list.toarray-CSDN博客 -------------------------------------------------------------------------------------------------------------------------------- toArray()介绍 toArray()方法是List接口中提供的方法ÿ…...
2013年11月10日 Go生态洞察:Go语言四周年回顾
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…...
Ubuntu上使用SSH连接到CentOS系统
确保CentOS系统上的SSH服务器已安装并正在运行: 在CentOS上,默认情况下,SSH服务器(sshd)应该已安装并正在运行。如果不确定,可以通过以下方式检查: sudo systemctl status sshd如果未安装&…...
【知识增强】A Survey of Knowledge-Enhanced Pre-trained LM 论文笔记
A Survey of Knowledge-Enhanced Pre-trained Language Models Linmei Hu, Zeyi Liu, Ziwang Zhao, Lei Hou, Liqiang Nie, Senior Member, IEEE and Juanzi Li 2023年8月的一篇关于知识增强预训练模型的文献综述 论文思维导图 思维导图网页上看不清的话,可以存…...
shell脚本之函数
快捷查看指令 ctrlf 进行搜索会直接定位到需要的知识点和命令讲解(如有不正确的地方欢迎各位小伙伴在评论区提意见,博主会及时修改) 函数 一,什么是函数 函数是一段功能代码,用来解决shell编程中冗余代码[重复且不连续出现的功能…...
订水商城实战教程10-宫格导航
上一篇我们介绍了跑马灯的功能,这一篇就进入到我们的主体部分开发。在订水商城业务中可以按照分类查询商品信息,这就涉及到数据源的拆分。 我们在数据源的设计中区分为主子表,主表呢存储唯一的记录,子表的记录可以重复࿰…...
【C++11】lambda表达式 | 包装器
文章目录 一、 lambda表达式lambda表达式的引入lambda表达式的语法lambda表达式与函数对象lambda表达式的捕捉列表 二、包装器function包装器bind包装器 一、 lambda表达式 lambda表达式的引入 在C98中,为了替代函数指针,C设计出了仿函数,也…...
网络安全准入技术之MAC VLAN
网络准入控制作为主要保障企业网络基础设施的安全的措施,特别是对于中大型企业来说,终端类型多样数量激增、终端管理任务重难度大、成本高。 在这样的一个大背景下,拥有更灵活的动态识别、认证、访问控制等成为了企业网络安全的最核心诉求之…...
MyBatis 操作数据库
文章目录 1. 什么是MyBatis?2. 入门MyBatis2.1 准备工作2.2.1 创建springboot项目2.2.2 数据准备 2.2 配置数据库连接2.3 写持久层代码2.4 单元测试2.4.1 web测试2.4.2 自动测试 1. 什么是MyBatis? MyBatis是一种持久层框架,用于简化JDBC的开…...
设计模式 -- 建造者模式(Builder Pattern)
这个模式以前也义Android-kotlin的场景下讲过 Android 用建造者模式模式写一个Dialog-CSDN博客 不过用的是 变种的建造者模式 建造者模式: 属于创建型模式 提供了一种创建对象的最佳方式, 使用多个简单的对象一步一步构建成一个复杂的对象 。 介绍 意图…...
如何下载 Apache + PHP + Mysql 集成安装环境并结合内网穿透工具实现公网访问内网服务
🌈个人主页:聆风吟 🔥系列专栏:网络奇遇记、Cpolar杂谈 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 📋前言一. WampServer下载安装二. WampServer启动三. 安装cpolar内网穿透3.1 注册账号…...
一招告别百度广告烦恼,同时效率提高100倍的几个常用搜索技巧!
《博主简介》 小伙伴们好,我是阿旭。专注于人工智能AI、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推荐--…...
文件上传 [ACTF2020 新生赛]Upload1
打开题目,发现是一道文件上传题目 随便上传个一句话木马上去 发现网站前端有白名单限制,只能上传含有jpg,png,gif的后缀文件 那我们便传个2.jpg的一句话木马上去,bp抓包 我们改成php文件后缀试试,发现重发…...
振南技术干货集:比萨斜塔要倒了,倾斜传感器快来!(1)
注解目录 1、倾斜传感器的那些基础干货 1.1 典型应用场景 (危楼、边坡、古建筑都是对倾斜敏感的。) 1.2 倾斜传感器的原理 1.2.1 滚珠式倾斜开关 1.2.2 加速度式倾斜传感器 1)直接输出倾角 2)加速度计算倾角 3)倾角精度的提高 (如果…...
手把手教你搭建属于自己的快递小程序
在数字化时代,小程序已经成为各行各业连接用户、提供服务、创造价值的重要工具。其中,快递寄件小程序因其实用性和广泛的需求,成为很多企业和开发者关注的焦点。本文将详细介绍如何快速创建快递寄件小程序,以及如何利用它实现盈利…...
C# Onnx LSTR 基于Transformer的端到端实时车道线检测
目录 效果 模型信息 项目 代码 下载 效果 端到端实时车道线检测 模型信息 lstr_360x640.onnx Inputs ------------------------- name:input_rgb tensor:Float[1, 3, 360, 640] name:input_mask tensor:Float[1, 1, 360, …...
Java相关编程思想
少用继承多用“组合”——在现有类的基础上组织一个新类。 2.继承要用“is”来检验,如果继承者is被继承者,说明这是一个比较好的继承。 3.向上造型,把实现方法留给继承者去实现。(动态绑定) 4.把接口理解为抽象类的进一…...
Hadoop-HDFS架构与设计
HDFS架构与设计 一、背景和起源二、HDFS概述1.设计原则1.1 硬件错误1.2 流水访问1.3 海量数据1.4 简单一致性模型1.5 移动计算而不是移动数据1.6 平台兼容性 2.HDFS适用场景3.HDFS不适用场景 三、HDFS架构图1.架构图2.Namenode3.Datanode 四、HDFS数据存储1.数据块存储2.副本机…...
OpenAI暂停新的ChatGPT Plus注册 | OpenAI 的 GPT Builder 创建您的 GPTs
OpenAI DevDay 才过去仅仅一周时间,伴随着开发者大会上发布的一系列重磅升级和新特性,无疑这样的进化速度让广大网友炸锅了,其火热程度可见一斑。 就在四个小时前,OpenAI的CEO Sam Altma突然宣布,ChatGPT Plus账号暂停…...
XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
android RelativeLayout布局
<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
密码学基础——SM4算法
博客主页:christine-rr-CSDN博客 专栏主页:密码学 📌 【今日更新】📌 对称密码算法——SM4 目录 一、国密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特点 2.3 基本部件 2.3.1 S盒 2.3.2 非线性变换 编辑…...
