XStream导出xml文件
最终效果
pom依赖
<dependency><groupId>com.thoughtworks.xstream</groupId><artifactId>xstream</artifactId><version>1.4.11.1</version></dependency>
代码
XStreamUtil
这个直接复制即可
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.core.util.QuickWriter;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import com.thoughtworks.xstream.io.xml.PrettyPrintWriter;
import com.thoughtworks.xstream.io.xml.XmlFriendlyReplacer;
import com.thoughtworks.xstream.io.xml.XppDriver;import java.io.Writer;
import java.lang.reflect.Field;public class XStreamUtil {public static XStream getXStream(Class<?> targetClass,Class<?> targetClass2) {XStream stream = new XStream(new XppDriver() {@Overridepublic HierarchicalStreamWriter createWriter(Writer out) {return new PrettyPrintWriter(out) {// 对所有xml节点的转换都增加CDATA标记boolean cdata = false;@Override@SuppressWarnings("rawtypes")public void startNode(String name, Class clazz) {super.startNode(name, clazz);cdata = needCDATA(targetClass, name);if(!cdata && targetClass2 != null ){cdata = needCDATA(targetClass2, name);}}@Overrideprotected void writeText(QuickWriter writer, String text) {if (cdata) {writer.write("<![CDATA[");writer.write(text);writer.write("]]>");} else {writer.write(text);}}};}});return stream;}private static boolean needCDATA(Class<?> targetClass, String fieldAlias){boolean cdata = false;//first, scan selfcdata = existsCDATA(targetClass, fieldAlias);if(cdata){return cdata;}//if cdata is false, scan supperClass until java.lang.ObjectClass<?> superClass = targetClass.getSuperclass();while(!superClass.equals(Object.class)){cdata = existsCDATA(superClass, fieldAlias);if(cdata) {return cdata;}superClass = superClass.getSuperclass();}return false;}private static boolean existsCDATA(Class<?> clazz, String fieldAlias){//scan fieldsField[] fields = clazz.getDeclaredFields();for (Field field : fields) {//1. exists XStreamCDATAif(field.getAnnotation(XStreamCDATA.class) != null ){XStreamAlias xStreamAlias = field.getAnnotation(XStreamAlias.class);//2. exists XStreamAliasif(null != xStreamAlias){if(fieldAlias.equals(xStreamAlias.value())){//matchedreturn true;}}else{// not exists XStreamAliasif(fieldAlias.equals(field.getName())){return true;}}}}return false;}public static XStream getXStream(Class<?> targetClass, Class<?>... subClasses) {XStream stream = new XStream(new XppDriver() {@Overridepublic HierarchicalStreamWriter createWriter(Writer out) {return new PrettyPrintWriter(out, new XmlFriendlyReplacer("_-", "_")) {// 对所有xml节点的转换都增加CDATA标记boolean cdata = false;@Override@SuppressWarnings("rawtypes")public void startNode(String name, Class clazz) {super.startNode(name, clazz);cdata = needCDATA(targetClass, name);if (subClasses != null && !cdata) {for (Class<?> subClass : subClasses) {if (subClass != null) {cdata = needCDATA(subClass, name);}}}}@Overrideprotected void writeText(QuickWriter writer, String text) {if (cdata) {writer.write("<![CDATA[");writer.write(text);writer.write("]]>");} else {writer.write(text);}}};}});return stream;}
}
ResponseSetUtils
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class ResponseSetUtils {public static void set(HttpServletResponse response, HttpServletRequest request) {response.addHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));response.addHeader("Access-Control-Allow-Headers", "Accept,Authorization,DNT,Content-Type,Referer,User-Agent");response.addHeader("Access-Control-Allow-Credentials", "true");}/*** 设置下载头*/public static void setResponseHeader(HttpServletResponse response, String fileName) {response.setContentType("application/octet-stream");response.addHeader("Content-Disposition", "attachment;filename=" + fileName);response.addHeader("Cache-control", "no-cache");}
}
controller
/*** 导出到xml** @param response* @param request* @param param* @return*/@PostMapping(value = "export-2-xml")public ResultModel<JSONObject> export2Xml(HttpServletResponse response, HttpServletRequest request,@RequestBody AdvertiseItemExportParam param) throws IOException {ResultModel<JSONObject> rst = new ResultModel<>();JSONObject track = new JSONObject().fluentPut("param", param);rst.setModule(track);try {// 登录校验;StringBuilder checkLoginMsg = new StringBuilder();BucSSOUser user = checkLoginUser(response, request, checkLoginMsg);if (StringUtils.isNotBlank(checkLoginMsg.toString())) {return ResultModel.failed(checkLoginMsg.toString());}// 用户信息;boolean agent = RealmIdEnum.AGENT_TENANT.getTenantId().equals(user.getRealmId());String no = agent ? user.getCorpUserId() : user.getEmpId();LoginUserRoleEnum loginUserRole = agent ? LoginUserRoleEnum.AGENT : LoginUserRoleEnum.INNER_USER;LoginUserModel userModel = new LoginUserModel(no, user.getNickNameCn(), agent, loginUserRole.name());// 分页查询数据;List allData = advertiseCommonController.getAllRows(param, userModel);// 转xml;XStream xStream;if (agent) {// 代理xStream = XStreamUtil.getXStream(OfferExportAgency.class);xStream.processAnnotations(OfferExportAgency.class);} else {// 非代理:运营、管理xStream = XStreamUtil.getXStream(OfferExportOperator.class);xStream.processAnnotations(OfferExportOperator.class);}xStream.alias("offerList", List.class);// 写输出流;String fileName = UUID.randomUUID().toString().replace("-", "") + ".xml";ResponseSetUtils.set(response, request);ResponseSetUtils.setResponseHeader(response, fileName);ServletOutputStream outputStream = response.getOutputStream();outputStream.write(XML_VERSION_1_0_ENCODING_UTF_8.getBytes(StandardCharsets.UTF_8));xStream.toXML(allData, outputStream);outputStream.flush();outputStream.close();// 返回结果;rst.setSuccess(true);return rst;} catch (IOException e) {LOGGER.error("AdvertiseItemController.export2Xml process error,param:{}",JSON.toJSONObject(param), e);rst.setErrorMsg("控制器异常:" + e.getMessage());return rst;}}
分页获取导出的数据
/*** 循环导出** @param param 参数* @return*/public List getAllRows(AdvertiseItemExportParam param, LoginUserModel userModel) {List allRows = new ArrayList<>();ResultModel<PageResult<BottomPoolOfferDTO>> queryList;int index = 1;do {param.setPageNum(index++);param.setPageSize(500);queryList = advertiseItemService.queryList(param, userModel);AssertUtil.isTrue(Objects.nonNull(queryList) && queryList.isSuccess(), "查询商品数据失败");AssertUtil.notNull(queryList.getModule(), "查询商品数据失败");List<BottomPoolOfferDTO> records = queryList.getModule().getResultList();if (org.apache.commons.collections.CollectionUtils.isNotEmpty(records)) {if (userModel.isAgentUser()) {// 代理allRows.addAll(records.stream().map(OfferExportAgency::fromBottomPoolOfferDTO).collect(Collectors.toList()));} else {// 运营allRows.addAll(records.stream().map(OfferExportOperator::fromBottomPoolOfferDTO).collect(Collectors.toList()));}}}// 如果当前已导出数据小于全量数据,同时后面还有可查询页时,继续循环查询;while ((allRows.size() < param.getExportSize()) && (index <= queryList.getModule().getPaginator().getTotalPage()));return allRows;}
实体类
@Data
@XStreamAlias("offer")
public class OfferExportAgency {@HeaderName(value = "商品主图", width = 50)@XStreamCDATAprivate String mainUrl;@HeaderName(value = "商品id", width = 20)private Long itemId;@HeaderName(value = "商品名称", width = 30)@XStreamCDATAprivate String title;@HeaderName(value = "权益标签", width = 25)private String benefitLabels;@HeaderName("起批量")private Long startOrderNumber;@HeaderName("热度")private Long hotIndex;@HeaderName("吸引力")private Long attractionIndex;@HeaderName(value = "一级分类", width = 20)@XStreamCDATAprivate String cateLevel1Name;@HeaderName("二级分类")@XStreamCDATAprivate String cateLevel2Name;@HeaderName(value = "三级分类", width = 20)@XStreamCDATAprivate String cateLevel3Name;@HeaderName(value = "店铺名称", width = 30)@XStreamCDATAprivate String shopName;@HeaderName(value = "商品图url", width = 100)@XStreamCDATAprivate String imageUrls;public static OfferExportAgency fromBottomPoolOfferDTO(BottomPoolOfferDTO offerDTO) {OfferExportAgency offer = new OfferExportAgency();BeanUtils.copyProperties(offerDTO, offer);// 权益标签if (offerDTO.getBenefitLabels() != null) {offer.setBenefitLabels(offerDTO.getBenefitLabels().parallelStream().map(AdvertiseItemPageQueryParam.BenefitLabelEnum::getDescByCode).collect(Collectors.toList()).toString());}return offer;}}
XStreamCDATA注解
package com.alibaba.china.tagnore.web.utils;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface XStreamCDATA {}相关文章:
XStream导出xml文件
最终效果 pom依赖 <dependency><groupId>com.thoughtworks.xstream</groupId><artifactId>xstream</artifactId><version>1.4.11.1</version></dependency>代码 XStreamUtil 这个直接复制即可 import com.thoughtworks.xst…...
陪诊小程序搭建:构建便捷医疗陪诊服务的创新实践
在当今快节奏的社会,医疗服务与人们的生活息息相关。然而,在医疗体系中,患者往往面临着信息不对称、流程繁琐、陪伴需求得不到满足等问题。为了解决这些问题,我们提出了一种创新的解决方案——陪诊小程序,旨在为患者提…...
0139__TCP协议
全网最详细TCP参数讲解,再也不用担心没有面试机会了_tcp的参数-CSDN博客 TCP协议详解-腾讯云开发者社区-腾讯云 TCP-各种参数 - 简书...
家政小程序的开发,带动市场快速发展,提高家政服务质量
当下生活水平逐渐提高,也增加了年轻人的工作压力,同时老龄化也在日益增加,使得大众对家政的需求日益提高,能力、服务质量高的家政人员能够有效提高大众的生活幸福指数。 但是,传统的家政服务模式存在着效率低、用户与…...
JavaScript高级程序设计(第四版)--学习记录之对象、类与面向对象编程(下)
类 ES6新引入class关键字具有正式定义类的能力。 类定义:类声明和类表达式。 // 类声明 class Person {} // 类表达式 const Animal class {}; 类定义与函数定义的不同: 1:函数声明可以提升,类定义不能 2:函数受函数…...
PDF 生成(5)— 内容页支持由多页面组成
当学习成为了习惯,知识也就变成了常识。 感谢各位的 关注、点赞、收藏和评论。 新视频和文章会第一时间在微信公众号发送,欢迎关注:李永宁lyn 文章已收录到 github 仓库 liyongning/blog,欢迎 Watch 和 Star。 回顾 在本篇开始…...
day 51 115.不同的子序列 583. 两个字符串的删除操作 72. 编辑距离
115. 不同的子序列 给你两个字符串 s 和 t ,统计并返回在 s 的 子序列 中 t 出现的个数,结果需要对 109 7 取模。 示例 1: 输入:s "rabbbit", t "rabbit" 输出:3 解释: 如下所示,…...
http包详解
http包的作用及使用 go的http包是go的web编程的核心内容,go的web框架本质上都是基于http提供的组件进行再度封装。我们来看一下http基本的使用: func main() {http.Handle("/get", GetVal())http.Handle("/hello", Hello())http.H…...
Reqable实战系列:Flutter移动应用抓包调试教程
Flutter应用网络请求调试一直是业内难题,原因在于Dart语言标准库的网络请求不会走Wi-Fi代理,常规通过配置Wi-Fi代理来抓包的方式行不通。这给我们日常开发测试造成了很大的阻碍,严重降低工作效率。因此写一篇教程,讲解如何使用Req…...
乾元通渠道商中标吴忠市自然灾害应急能力提升项目
近日,乾元通渠道商中标宁夏回族自治区吴忠市自然灾害应急能力提升项目,乾元通作为设备厂家,为项目提供通信指挥类装备(多链路聚合设备)QYT-X1。 青岛乾元通数码科技有限公司作为国家应急产业企业,深耕于数据…...
护网蓝队面试
一、sql注入分类 **原理:**没有对用户输入项进行验证和处理直接拼接到查询语句中 查询语句中插⼊恶意SQL代码传递后台sql服务器分析执行 **从注入参数类型分:**数字型注入、字符型注入 **从注入效果分:**报错注入、布尔注入、延时注入、联…...
【高考志愿】金融学
目录 一、金融学类专业概述 二、主要课程 三、就业前景与方向 四、适合人群 五、金融学学科排名 六、总结 高考志愿选择金融学,无疑是一个既充满挑战又极具前景的决策。金融学,作为经济学门类下的重要分支,不仅涵盖了广泛的金融领域知识…...
返利App的用户行为分析与数据驱动决策
返利App的用户行为分析与数据驱动决策 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨返利App中的用户行为分析与数据驱动决策的技术细节和实…...
python基础:高级数据类型:集合
1、集合的定义 集合是一个无序且无重复元素的列表。其定义与数学定义一致。其无序和不重复和字典特征类似,但是无“值”。 2、集合的创建 集合一般由列表创建,在初始化列表时保证其元素唯一性,即为集合。 创建方法:x set(list…...
idk17配置
只需要把zip包解压,然后配置环境变量: bin目录路径粘到path里面就好了 然后打开cmd窗口分别输入 java javac java -version 验证...
Java实现日志全链路追踪.精确到一次请求的全部流程
广大程序员在排除线上问题时,会经常遇见各种BUG.处理这些BUG的时候日志就格外的重要.只有完善的日志才能快速有效的定位问题.为了提高BUG处理效率.我决定在日志上面优化.实现每次请求有统一的id.通过id能获取当前接口的全链路流程走向. 实现效果如下: 一次查询即可找到所有关…...
你敢相信吗,AI绘画正在逐渐取代你的工作!
前言 在当今信息技术高速发展的时代,AI绘画技术的崛起已引起了广泛关注和讨论。许多人开始担心AI技术是否会逐渐取代传统绘画师的工作。人类无疑是感性的动物,创作出来的艺术作品常常带有浓郁的个人风格和情感。但AI绘画在某些方面的突破,使…...
博途PLC轴工艺对象随动误差监视功能
S7-1200PLC和V90总线伺服通过工艺对象实现定位控制时在组态工艺对象里有这样的随动误差监视功能介绍,关于这个功能,今天我们解读下,工艺对象组态编程可以参考下面文章链接: S7-1200PLC和V90总线伺服通过工艺对象实现定位控制(标准报文3应用)_v90工艺对象3号报文-CSDN博客文…...
《昇思25天学习打卡营第24天 | 昇思MindSporeResNet50图像分类》
24天 本节学习了使用ResNet50网络对CIFAR-10数据集进行分类。 步骤: 1.数据集准备与加载 2.构建网络 残差网络结构(Residual Network)是ResNet网络的主要亮点,ResNet使用残差网络结构后可有效地减轻退化问题,实现更深的网络结构设计&#x…...
糟糕的管理者都有这几个特征
在我们的职业生涯中,我们都期望能遇到一位英明睿智、引领团队走向辉煌的管理者。然而,现实往往并非总是如此美好,总会有一些管理能力差的人混迹其中,给团队带来诸多困扰。今天,我们就来看看糟糕的管理者身上都有哪些特…...
【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
