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对象转换为XML
            StringWriter 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则表示要构建list
	            if (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.mfbz.cn/a/761677.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python自动化,实现自动登录并爬取商品数据,实现数据可视化

关于如何使用Python自动化登录天 猫并爬取商品数据的指南&#xff0c;我们需要明确这是一个涉及多个步骤的复杂过程&#xff0c;且需要考虑到天猫的反爬虫策略。以下是一个简化的步骤指南&#xff1a; 步骤一&#xff1a;准备工作 环境准备&#xff1a;确保你的Python环境已经…

002-基于Sklearn的机器学习入门:基本概念

本节将继续介绍与机器学习有关的一些基本概念&#xff0c;包括机器学习的分类&#xff0c;性能指标等。同样&#xff0c;如果你对本节内容很熟悉&#xff0c;可直接跳过。 2.1 常见的监督学习方法

docker部署wg-easy和firefly

Background WireGuard是一种新型的VPN协议,它通过在内核层运行,提供高效、安全、简单和现代的VPN解决方案。wg-easy是一个专为简化 WireGuard VPN配置和管理而设计的工具&#xff0c;提供了界面化的管理&#xff0c;进一步降低WireGuard 的使用门槛&#xff0c;让用户无需深入了…

Python | Leetcode Python题解之第208题实现Trie(前缀树)

题目&#xff1a; 题解&#xff1a; class Trie:def __init__(self):self.children [None] * 26self.isEnd Falsedef searchPrefix(self, prefix: str) -> "Trie":node selffor ch in prefix:ch ord(ch) - ord("a")if not node.children[ch]:retur…

浅谈定时器之泊松随机定时器

浅谈定时器之泊松随机定时器 “泊松随机定时器”(Poisson Random Timer)&#xff0c;它允许你基于泊松分布来随机化请求之间的延迟时间&#xff0c;这对于模拟具有随机到达率的事件特别有用&#xff0c;如用户访问网站或服务的请求。 泊松分布简介 泊松分布是一种统计与概率…

监听蓝牙对话的BlueSpy技术复现

本文是之前文章的BlueSpy技术的复现过程&#xff1a;https://mp.weixin.qq.com/s/iCeImLLPAwwKH1avLmqEpA 2个月前&#xff0c;网络安全和情报公司Tarlogic在西班牙安全大会RootedCon 2024上提出了一项利用蓝牙漏洞的BlueSpy技术&#xff0c;并在之后发布了一个名为BlueSpy的概…

嵌入式linux系统中动态链接库实现详解

大家好,linux系统中动态库是如何实现相互链接的?今天简单聊聊动态链接库的实现原理。 假设有这样两段代码,第一段代码定义了一个全量变量a以及函数foo,函数foo中引用了下一段代码中定义的全局变量b。 第二段代码定义了全局变量b以及main函数,同时在main函数中调用了第一个…

CEPH 系统盘挂了,如何使用数据盘恢复

硬盘损坏是早晚的时&#xff0c;CEHP数据盘坏了&#xff0c;使用CEPH的基本都轻车熟路了&#xff0c;如果系统盘坏了呢&#xff1f;不知道的可能会采取整个系统盘全做的方式 前提条件&#xff1a;使用cephadm搭建集群 如果换服务器&#xff0c;请确保CEPH数据盘放到其它服务器上…

mysql数据库的读写分离

该章节的实验需要基于http://t.csdnimg.cn/mT4Bs中的实验来进行。 读写分离 实现方法 在代码上实现读写分离&#xff0c;但对于运维者不友好 设置代理 现在大多采用amoeba作为中间代理服务器做读写分离操作。 2008&#xff0c;阿里巴巴前员工&#xff0c;陈思儒基于java1.6的环…

Java面试题--JVM大厂篇之深入了解G1 GC:高并发、响应时间敏感应用的最佳选择

引言&#xff1a; 在现代Java应用的性能优化中&#xff0c;垃圾回收器&#xff08;GC&#xff09;的选择至关重要。对于高并发、响应时间敏感的应用而言&#xff0c;G1 GC&#xff08;Garbage-First Garbage Collector&#xff09;无疑是一个强大的工具。本文将深入探讨G1 GC适…

XJTUSE-数据结构-homework2

当时写的还挺痛苦的 不过现在看&#xff0c;原老师布置的作业真的有水平 现在来看大二数据结构的作业&#xff0c;真的很锻炼代码能力。有些题目&#xff0c;我现在写也不一定能很快写出来hhhh 当时写的作业感觉还是存在问题的&#xff01; 任务概述 任务 1 &#xff1a;指定的…

期末考试后,老师如何高效把成绩发给家长

期末考试终于结束了&#xff0c;老师们是不是感觉松了一口气呢&#xff1f;但是&#xff0c;成绩发布这个环节可不能马虎哦&#xff01;今天&#xff0c;我就来跟大家分享一下如何高效地把成绩发给家长&#xff0c;让这个环节变得既轻松又高效&#xff01; 先把最高效的方式告诉…

mac英语学习工具:Eudic欧路词典 for Mac 激活版

Eudic欧路词典是一款非常受欢迎的英语学习软件&#xff0c;它提供了丰富的词汇解释、例句、同义词、反义词等功能&#xff0c;帮助用户更好地理解和掌握英语单词。 以下是Eudic欧路词典的一些主要特点&#xff1a; 海量词汇库&#xff1a;Eudic欧路词典拥有庞大的词汇库&#…

树状数组——点修区查与区修点查

树状数组是一种代码量小&#xff0c;维护区间的数据结构 他可以实现&#xff1a; 1.区间修改&#xff0c;单点查询 2.单点修改&#xff0c;区间查询 当然&#xff0c;二者不可兼得&#xff0c;大人全都要的话&#xff0c;请选择线段树 前置知识&#xff1a; lowbit(x)操作…

前端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…

海外仓一件代发功能自动化:海外仓WMS系统配置方法

根据数据显示&#xff0c;2014-2019年短短几年之间&#xff0c;跨境电商销售总额增长了160%以上。这为跨境电商商家和海外仓&#xff0c;国际物流等服务端企业都提供了巨大的发展机遇。 然而&#xff0c;作为海外仓&#xff0c;要想服务好跨境电商&#xff0c;仓库作业的每一个…

Windows Server 2019部署网络负载均衡NLB服务的详细操作步骤

部署前准备 首先需要准备两台Windows Server 2019服务器&#xff0c;虚拟机创建请参考 VMware Workstation安装Windows Server2019系统详细操作步骤_安装windows server 2019操作系统(写出操作过程)-CSDN博客 克隆虚拟机请参考 VMware Workstation克隆虚拟机详细步骤-CSDN博…

【FFmpeg】av_write_frame函数

目录 1.av_write_frame1.1 写入pkt&#xff08;write_packets_common&#xff09;1.1.1 检查pkt的信息&#xff08;check_packet&#xff09;1.1.2 准备输入的pkt&#xff08;prepare_input_packet&#xff09;1.1.3 检查码流&#xff08;check_bitstream&#xff09;1.1.4 写入…

leetcode 403周赛 包含所有1的最小矩形面积||「暴力」

3197. 包含所有 1 的最小矩形面积 II 题目描述&#xff1a; 给你一个二维 二进制 数组 grid。你需要找到 3 个 不重叠、面积 非零 、边在水平方向和竖直方向上的矩形&#xff0c;并且满足 grid 中所有的 1 都在这些矩形的内部。 返回这些矩形面积之和的 最小 可能值。 注意…

AI写作革命:AI如何成为你的全能型写作助手

工欲善其事&#xff0c;必先利其器。 随着AI技术与各个行业或细分场景的深度融合&#xff0c;日常工作可使用的AI工具呈现出井喷式发展的趋势&#xff0c;AI工具的类别也从最初的AI文本生成、AI绘画工具&#xff0c;逐渐扩展到AI思维导图工具、AI流程图工具、AI生成PPT工具、AI…
最新文章