使用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账号暂停…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
