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…...
糟糕的管理者都有这几个特征
在我们的职业生涯中,我们都期望能遇到一位英明睿智、引领团队走向辉煌的管理者。然而,现实往往并非总是如此美好,总会有一些管理能力差的人混迹其中,给团队带来诸多困扰。今天,我们就来看看糟糕的管理者身上都有哪些特…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...

Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...

day36-多路IO复用
一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...