springboot调用wsdl接口

springboot调用wsdl接口

  1. maven依赖
	<!--xml报文数据--><dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-xml</artifactId><version>2.9.8</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web-services</artifactId></dependency><dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-frontend-jaxws</artifactId><version>3.1.12</version></dependency><dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-transports-http</artifactId><version>3.1.12</version></dependency><!-- https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api --><dependency><groupId>javax.xml.bind</groupId><artifactId>jaxb-api</artifactId><version>2.1</version></dependency><!-- https://mvnrepository.com/artifact/org.dom4j/dom4j --><dependency><groupId>org.dom4j</groupId><artifactId>dom4j</artifactId><version>2.1.4</version></dependency><!-- 需要指定JDK版本哦:2.413,15两个JDK版本 --><dependency><groupId>net.sf.json-lib</groupId><artifactId>json-lib</artifactId><version>2.4</version><classifier>jdk15</classifier></dependency><!-- https://mvnrepository.com/artifact/org.json/json --><dependency><groupId>org.json</groupId><artifactId>json</artifactId><version>20240303</version></dependency>
  1. 要求的入参出参示例
    入参:
<InParam><PatientCode>310230198804141XXX</PatientCode><PatientCodeType>SH</PatientCodeType><VisitType /><VisitNo /><ReportType /><BeginTime>2020-08-16 00:00:01</BeginTime><EndTime>2021-08-16 23:59:59</EndTime>
</InParam>

出参:

<OutParam><ResultCode>1</ResultCode><ResultInfo>成功</ResultInfo><DataDetail><Report><ReportNo>A0001</ReportNo><ApplyOrderNo>112654</ApplyOrderNo><PatientNo>123456</PatientNo><VisitType>I</VisitType><VisitNo>111</VisitNo><SampleDesc>xxx</SampleDesc><ReportClass>01</ReportClass><ReportClassName>分类名称</ReportClassName><DrawDocCode>L1</DrawDocCode><DrawDocName>郭靖</DrawDocName><SampleTime>2016-03-13 09:00:00</SampleTime><ReciveDoc>L00168</ReciveDoc><ReciveDocName>黄蓉</ReciveDocName><ReciveTime>2016-03-13 09:10:00</ReciveTime><ReportDoc>L00178</ReportDoc><ReportDocName>欧阳修</ReportDocName><ReportTime>2016-03-13 09:10:00</ReportTime><BodySite/><ExamDept>1011</ExamDept><ExamDeptName>部门名称</ExamDeptName><VerifiDoc>L178</VerifiDoc><VerifiDocName>欧阳修</VerifiDocName><VerifiTime>2016-03-13 09:10:00</VerifiTime><Status>3</Status></Report></DataDetail>
</OutParam>
  1. 代码实现
  • xml传参实体类
@XmlRootElement(name = "InParam")
public class RisReportDTO {private String PatientCode;private String PatientCodeType;private String VisitType;private String VisitNo;private String ReportType;private String BeginTime;private String EndTime;@XmlElement(name = "PatientCode", required = true)public String getPatientCode() {return PatientCode;}public void setPatientCode(String patientCode) {PatientCode = patientCode;}@XmlElement(name = "PatientCodeType", required = true)public String getPatientCodeType() {return PatientCodeType;}public void setPatientCodeType(String patientCodeType) {PatientCodeType = patientCodeType;}@XmlElement(name = "VisitType")public String getVisitType() {return VisitType;}public void setVisitType(String visitType) {VisitType = visitType;}@XmlElement(name = "VisitNo")public String getVisitNo() {return VisitNo;}public void setVisitNo(String visitNo) {VisitNo = visitNo;}@XmlElement(name = "ReportType")public String getReportType() {return ReportType;}public void setReportType(String reportType) {ReportType = reportType;}@XmlElement(name = "BeginTime", required = true)public String getBeginTime() {return BeginTime;}public void setBeginTime(String beginTime) {BeginTime = beginTime;}@XmlElement(name = "EndTime", required = true)public String getEndTime() {return EndTime;}public void setEndTime(String endTime) {EndTime = endTime;}
}
  • 参数传值
导包路径:
import com.common.utils.xmlutils.XmlUtil;
import com.icu.dto.xmldto.RisReportDTO;
import com.icu.dto.xmldto.RisReportDetailsDTO;
import net.sf.json.JSONObject;
import org.apache.commons.lang.StringUtils;
import org.dom4j.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import java.io.*;
import java.util.*;public class ReportUtil {private static Logger logger = LoggerFactory.getLogger(ReportUtil.class);public static String getLisReportList(String hm, String lx, String startTime, String endTime) {RisReportDTO reportDTO = new RisReportDTO();reportDTO.setPatientCode(zjhm);reportDTO.setPatientCodeType(zjlx);if (StringUtils.isNotBlank(startTime)) {reportDTO.setBeginTime(startTime);}if (StringUtils.isNotBlank(endTime)) {reportDTO.setEndTime(endTime);}// 创建JAXB上下文JAXBContext jaxbContext = null;String xmlString = null;try {jaxbContext = JAXBContext.newInstance(RisReportDTO.class);// 创建Marshaller对象Marshaller marshaller = jaxbContext.createMarshaller();// 将Person对象转换为XMLStringWriter sw = new StringWriter();marshaller.marshal(reportDTO, sw);// 输出XML字符串xmlString = sw.toString();} catch (JAXBException e) {throw new RuntimeException(e);}// 发送检查报告列表String responseData = XmlUtil.sendWsdl(xmlString, "方法名称");return responseData;}
}
  • 调用wsdl接口
import com.alibaba.fastjson.JSON;
import net.sf.json.JSONObject;
import org.apache.commons.lang.StringUtils;
import org.apache.cxf.endpoint.Client;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Namespace;
import org.dom4j.QName;
import org.json.JSONArray;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.util.*;public class XmlUtil {private static Logger logger = LoggerFactory.getLogger(XmlUtil.class);/*** 根据参数发送数据* @param xmlParam* @return*/public static String sendWsdl(String xmlParam, String method) {// 创建动态客户端JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();Client client = dcf.createClient("http://xxx.xxx.xxx.xxx:xxxx/services/XXXXXX?wsdl");// 将XML字符串作为单个参数传递Object[] params = new Object[]{xmlParam};Object[] objects = null;try {// invoke("方法名",参数1,参数2,参数3....);objects = client.invoke(method, params);logger.info("返回数据:" + objects[0]);} catch (java.lang.Exception e) {e.printStackTrace();}return objects[0].toString();}
}
  1. 将xml格式响应报文解析为Json格式或者Map格式
import net.sf.json.JSONObject;
import org.apache.commons.lang.StringUtils;
import org.dom4j.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import java.io.*;
import java.util.*;public class XmlJson{/*** 将xml格式响应报文解析为Json格式* @param responseXmlTemp* @return*/public static String xml2Json(String responseXmlTemp) {Document doc = null;try {doc = DocumentHelper.parseText(responseXmlTemp);} catch (DocumentException e) {logger.error("parse text error : " + e);}Element rootElement = doc.getRootElement();Map<String,Object> mapXml = new HashMap<String,Object>();element2Map(mapXml,rootElement);String jsonXml = JSONObject.fromObject(mapXml).toString();return jsonXml;}/*** 将xml格式响应报文解析为Map格式* @param responseXmlTemp* @param* @return* @throws DocumentException*/public static Map<String, Object> xml2map(String responseXmlTemp) {Document doc = null;try {doc = DocumentHelper.parseText(responseXmlTemp);} catch (DocumentException e) {logger.error("parse text error : " + e);}Element rootElement = doc.getRootElement();Map<String,Object> mapXml = new HashMap<String,Object>();element2Map(mapXml,rootElement);System.out.println("Map >>> " + mapXml);return mapXml;}/*** 使用递归调用将多层级xml转为map* @param map* @param rootElement*/public static void element2Map(Map<String, Object> map, Element rootElement) {//获得当前节点的子节点List<Element> elements = rootElement.elements();if (elements.size() == 0) {//没有子节点说明当前节点是叶子节点,直接取值map.put(rootElement.getName(), rootElement.getText());} else if (elements.size() == 1) {//只有一个子节点说明不用考虑list的情况,继续递归Map<String, Object> tempMap = new HashMap<String, Object>();element2Map(tempMap, elements.get(0));map.put(rootElement.getName(), tempMap);} else {//多个子节点的话就要考虑list的情况了,特别是当多个子节点有名称相同的字段时Map<String, Object> tempMap = new HashMap<String, Object>();for (Element element : elements) {tempMap.put(element.getName(), null);}Set<String> keySet = tempMap.keySet();for (String string : keySet) {Namespace namespace = elements.get(0).getNamespace();List<Element> sameElements = rootElement.elements(new QName(string, namespace));//如果同名的数目大于1则表示要构建listif (sameElements.size() > 1) {List<Map> list = new ArrayList<Map>();for (Element element : sameElements) {Map<String, Object> sameTempMap = new HashMap<String, Object>();element2Map(sameTempMap, element);list.add(sameTempMap);}map.put(string, list);} else {//同名的数量不大于1直接递归Map<String, Object> sameTempMap = new HashMap<String, Object>();element2Map(sameTempMap, sameElements.get(0));map.put(string, sameTempMap);}}}}
}
  1. 将返回的xml数据保存到本地
/**
* 保存返回的xml数据到本地
* @param zjhm
* @param responseData 要保存的数据
* @param lxmc
*/
public void doSomethingAsync(String zjhm, String responseData, String lxmc) {// 这个方法将在新的线程中异步执行logger.info("信息");// 将返回结果保存在文件中,使用UTF-8编码将XML内容写入文件SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");String url = UrlConfig.getBaocunUrl() + "/baogao/" + sdf.format(new Date()) + "/" + zjhm  + "/"+ lxmc +"/";if (!new File(url).exists()) {new File(url).mkdirs();}String filename = url + System.currentTimeMillis() + ".xml";if (!new File(filename).exists()) {try {new File(filename).createNewFile();} catch (IOException e) {throw new RuntimeException(e);}}try (FileOutputStream fos = new FileOutputStream(filename);OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8")) {osw.write(responseData);} catch (Exception e) {e.printStackTrace();}
}
  1. 方法调用
public R listReport() {String responseData = ReportUtil.getLisReportList(dto.getPatientID().getZjhm(), dto.getPatientID().getZjlx(), dto.getPatientID().getTimeDuration().getStart(), dto.getPatientID().getTimeDuration().getEnd());// 开启异步,保存文件doSomethingAsync(dto.getPatientID().getZjhm(), responseData, "jiancha");String string = ReportUtil.xml2Json(responseData);JSONObject jcReportJson = JSON.parseObject(string);JSONObject resultCodeJson = JSON.parseObject(jcReportJson.getString("ResultCode"));String resultCode = resultCodeJson.getString("ResultCode");if (resultCode.equals("1")) {String dataDetail = jcReportJson.getString("DataDetail");if (org.apache.commons.lang.StringUtils.isNotBlank(dataDetail)) {com.alibaba.fastjson.JSONObject dataDetailJson = JSON.parseObject(jcReportJson.getString("DataDetail"));String reportDetail = dataDetailJson.getString("Report");JSONArray jsonArray = new JSONArray(reportDetail);List<NodeVO> baogaoVoList = new ArrayList<>();for (int i = 0; i < jsonArray.length(); i++) {org.json.JSONObject jsonObject = jsonArray.getJSONObject(i);String reportNo = jsonObject.getJSONObject("ReportNo").getString("ReportNo");String reportName = jsonObject.getJSONObject("ReportName").getString("ReportName");String reportTime = jsonObject.getJSONObject("ReportTime").getString("ReportTime");// 这里是新建对象,用于保存数据,可根据自己需求进行修改/*NodeVO nodeVO = new NodeVO();nodeVO.setWybh(reportNo);nodeVO.setName(reportName);SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");try {nodeVO.setTime(sdf.parse(reportTime));} catch (ParseException e) {throw new RuntimeException(e);}nodeVO.setType("U09");baogaoVoList.add(nodeVO);*/}//nodeList.add(baogaoVoList);}}}

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

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

相关文章

nodejs--【Express基本使用】

10 【Express基本使用】 https://www.expressjs.com.cn/ 基于 Node.js 平台&#xff0c;快速、开放、极简的 web 开发框架。 1.Express的安装方式 Express的安装可直接使用npm包管理器上的项目&#xff0c;在安装npm之前可先安装淘宝镜像&#xff1a; npm install -g cnpm -…

Mysql 对重复数据筛选过滤

在日常开发工作中常会遇到要对数据库中的重复数据做筛选的操作需求&#xff0c;可以考虑使用排序函数&#xff08;ROW_NUMBER()&#xff09; 第一种写法&#xff1a;row_number() over(partition by 一个或多个分组列 order by 一个或多个排序列 asc/desc) as 别名 //如果不写a…

PostgreSQL 数据库设计与管理(四)

1. 数据库设计原则 1.1 规范化 规范化是组织数据库结构的一种方法&#xff0c;旨在减少数据冗余并提高数据完整性。常用的规范化范式包括&#xff1a; 第一范式&#xff08;1NF&#xff09;&#xff1a; 确保每列都是原子的&#xff0c;不可再分。第二范式&#xff08;2NF&a…

领先Intel 旗舰60%,AMD锐龙9000系桌面CPU彻底杀疯了

早在月初台北国际电脑展上&#xff0c;Intel 公布了下一代低功耗移动端处理器 Lunar Lake。 也就是第二代移动版酷睿 Ultra。 而作为叫板王&#xff0c;AMD 丝毫不怂&#xff0c;不但掏出了 Ryzen AI 300 移动端处理器应对。 还抢在 Intel 之前带来了全新一代 Zen 5 架构 Ryz…

前端vue项目升级nodejs后无法运行了

问题描述&#xff1a; 运行、打包都正常的vue项目&#xff0c;在将nodejs升级到v20.14.0后&#xff0c;均报错了&#xff1a; Error: error:0308010C:digital envelope routines::unsupported opensslErrorStack: [ error:03000086:digital envelope routines::initializ…

制造业如何拥抱数字化?百数服务商的转型策略与实践

制造业作为实体经济的主体部分&#xff0c;也是核心部分&#xff0c;发挥着基础性、主导性和引领性作用。推动制造业数字化转型是实现经济高质量发展的必由之路。 在这场数字化浪潮中&#xff0c;低代码平台作为一种新兴的技术手段&#xff0c;逐渐受到了企业的青睐。其能够在…

[5]python+selenium - UI自动框架之重写unittest.TestCase

重写unittest.TestCase 不仅继承了unittest的方法&#xff0c;还丰富不同断言方法&#xff0c;用起来更方便、简单。 import unittest from common.BSBase import BasePage from common.log import log from common.browserDriver import getdriver from common.publicFunc imp…

2024.06.30 刷题日记

121. 买卖股票的最佳时机 实例 1&#xff1a; 输入&#xff1a;[7,1,5,3,6,4] 输出&#xff1a;5 解释&#xff1a;在第 2 天&#xff08;股票价格 1&#xff09;的时候买入&#xff0c;在第 5 天&#xff08;股票价格 6&#xff09;的时候卖出&#xff0c;最大利润 6-1 5…

高考假期预习指南:开启你的IT学习之旅

七月来临&#xff0c;各省高考分数已揭榜完成。而高考的完结并不意味着学习的结束&#xff0c;而是新旅程的开始。对于有志于踏入IT领域的高考少年们&#xff0c;这个假期是开启探索IT世界的绝佳时机。作为一名在计算机行业深耕多年的专家&#xff0c;我愿意为准新生们提供一份…

等级保护测评在测评中Linux系统怎么改

在等级保护测评中&#xff0c;针对Linux系统的整改主要是为了提高其安全性&#xff0c;使之符合等级保护的基本要求。 以下是一些常见的整改步骤和建议&#xff1a; 1. 身份鉴别&#xff1a; • 强化密码策略&#xff0c;例如设置复杂的密码规则、密码长度、密码复杂度、密码…

Web基础与HTTP协议:

Web基础与HTTP协议 Web&#xff1a;就是我们所说的页面&#xff0c;打开网站所展示的页面。&#xff08;全球广域网&#xff0c;万维网&#xff09; 分布式图形信息系统。 http https &#xff08;加密的&#xff09;超文本传输协议 分布式&#xff1a;计算机系统或者应用程序…

大型游乐设施操作试题

选择题 1、《游乐设施安全技术监察规程(试行)》规定:制造单位应在游乐设施明显部位装设铭牌&#xff0c;铭牌内容至少应包括制造单位名称与地址、设备名称、编号等等技术参数&#xff0c;但下列除哪项外均正确。[单选题]* A、速度和高度 B、生产许可证号 C、制造单位的联系电话…

WLAN Hostapd配置参数详解 - EN

中文的配置参数详解&#xff1a;WLAN Hostapd配置参数详解-CSDN博客 ##### hostapd configuration file ############################################## # Empty lines and lines starting with # are ignored # AP netdevice name (without ap postfix, i.e., wlan0 uses wl…

vue3引入本地静态资源图片

一、单张图片引入 import imgXX from /assets/images/xx.png二、多张图片引入 说明&#xff1a;import.meta.url 是一个 ESM 的原生功能&#xff0c;会暴露当前模块的 URL。将它与原生的 URL 构造器 组合使用 注意&#xff1a;填写自己项目图片存放的路径 /** vite的特殊性…

SQL注入【1】——通用漏洞/SQL注入/mysql跨库/ACCESS偏移

一、知识点: 1、脚本代码与数据库前置知识 2、Access数据库注入-简易&偏移 3、MYSQL数据库注入-简易:权限跨库 二、前置知识: &#xff08;一&#xff09;SQL注入漏洞产生原理分析 SQL注入产生条件&#xff1a;根本条件&#xff1a;可控变量、特定函数。 脚本代码在实现…

教育行业的网络安全:保护学生数据与防范网络欺凌

在数字化的春风中&#xff0c;教育行业迎来了知识的繁花似锦&#xff0c;然而&#xff0c;随之而来的网络安全风暴也悄然逼近。学生数据的脆弱性与网络欺凌的阴影交织成一幅复杂的画卷&#xff0c;呼唤着教育工作者与技术专家共同编织一张密不透风的网络安全之网。本文深入探讨…

C++修饰符类型

一、存储类运算符 auto&#xff08;自动存储类&#xff0c;但在现代C中&#xff0c;它通常用于自动类型推导&#xff09; register&#xff08;建议编译器将变量存储在寄存器中&#xff0c;但现代编译器通常忽略此关键字&#xff09; static&#xff08;静态存储类&#xff…

【Spring】Spring Security 核心类介绍及Spring Security 的验证机制

Spring Security 核心类介绍及Spring Security 的验证机制 一、Spring Security 核心类1.1 Authentication1.2 SecurityContextHolder1.3 UserDetails1.4 UserDetailsService1.5 GrantedAuthority1.6 DaoAuthenticationProvider1.7 PasswordEncoder 二、 Spring Security 的验证…

国产压缩包工具——JlmPackCore SDK说明(二)——JlmPack_Create函数说明

一、JlmPack_Create函数说明 JlmPack_Create函数是创建jlm压缩文件的核心函数&#xff0c;最大允许CATALOG_MAX_LIMIT&#xff08;请参考Config.h&#xff09;个目录&#xff0c;意思是包括文件夹和文件在内&#xff0c;遍历整个列表最大允许CATALOG_MAX_LIMIT个目录对象&#…

《昇思25天学习打卡营第4天|数据集 Dataset》

文章目录 前言&#xff1a;今日所学&#xff1a;1. 数据集加载2. 数据集迭代3. 数据集常用操作与自定义数据集 前言&#xff1a; 今天学习的是数据集的内容。首先&#xff0c;数据是深度学习的基石&#xff0c;高质量的数据输入能够在整个深度神经网络中发挥积极作用。MindSpo…