XStream 1.4.10版本处理xml使用问题
XStream pom依赖:
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.10</version>
</dependency>
1、对象解析成xml字符串时下划线变成双下划线
解决:
xStream = new XStream(new DomDriver("UTF-8", new XmlFriendlyNameCoder("_-", "_")));
或者
xStream = new XStream(new Xpp3Driver(new NoNameCoder()));
2、Security framework of XStream not initialized, XStream is probably vulnerable
解决:
XStream.setupDefaultSecurity(xStream);
xStream.allowTypesByWildcard(new String[] {
"com.common.util.**" //你的包路径
});
3、处理既有属性又有值的情况
形如:<Query Code="1">select * from user</Query>
使用自定义转换器实现,如下:
public class QueryConverter implements Converter {
@Override
public boolean canConvert(Class type) {
return type.equals(Query.class);
} /**
* 将java对象转为xml时使用
*/
@Override
public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
Query query = (Query) source;
// 设置属性值
writer.addAttribute("Code", query.getCode());
// 设置文本值
writer.setValue(query.getText());
} /**
* 将xml转为java对象使用
*/
@Override
public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
Query query = new Query();
query.setTransactionCode(reader.getAttribute("Code"));
query.setText(reader.getValue());
return query;
}
}
之后通过注解@XStreamConverter(value = QueryConverter.class)
或代码注册转换器使用:
xStream.registerConverter(new xxxConverter());
4、时间转换器
字段为Date类型
public class DateConverter implements Converter { @Override
public boolean canConvert(Class arg0) {
return Date.class == arg0;
} @Override
public void marshal(Object arg0, HierarchicalStreamWriter arg1, MarshallingContext arg2) {
} @Override
public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext arg1) { GregorianCalendar calendar = new GregorianCalendar();
//格式化当前系统日期
SimpleDateFormat dateFm = new SimpleDateFormat("yyyy-MM-dd");
try {
calendar.setTime(dateFm.parse(reader.getValue()));
} catch (ParseException e) {
throw new ConversionException(e.getMessage(), e);
} return calendar.getTime();
}
}
使用:
@XStreamConverter(DateConverter.class)
private Date beginTime;
属性为Date类型处理SingleValueConverter
public class XStreamDateConverter implements SingleValueConverter { @Override
public boolean canConvert(Class arg0) {
return Date.class == arg0;
} @Override
public Object fromString(String arg0) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
try {
return format.parse(arg0);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
} @Override
public String toString(Object arg0) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
try {
return format.format((Date) arg0);
} catch (Exception e) {
e.printStackTrace();
}
return "";
} }
之后将转化加在Date属性的字段上使用即可
@XStreamConverter(value=XStreamDateConverter.class)
@XStreamAsAttribute
private Date beginTime;
5、针对null值的字段也显示在xml中处理
大概思路就是遍历对象的所有的字段,若当前字段的值为null,则处理成空字符串,示例自定义转换器如下:
public class FieldConverter implements Converter { /**
* 日志记录
*/
private static final Logger LOGGER = LoggerFactory.getLogger(FieldConverter.class); /**
* 时间格式
*/
private String formatPattern; public FieldConverter() {
} public FieldConverter(String formatPattern) {
this.formatPattern = formatPattern;
} @Override
public boolean canConvert(Class type) {
return true;
} /**
* 将java对象转为xml时使用
*/
@Override
public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
try {
handleSource(source, writer);
} catch (Exception e) {
LOGGER.error("[FieldConverter] marshal 异常,{}", e);
throw new IllegalArgumentException("转换xml出错");
}
} /**
* @description :处理对象为xml转换
* @param source 对象源
* @param writer 流写出对象
* @date 2019/9/29 18:48
* @modifier
* @return void
*/
private void handleSource(Object source, HierarchicalStreamWriter writer) throws IllegalAccessException { try {
Class<?> aClass = source.getClass();
Field[] declaredFields = aClass.getDeclaredFields();
for (Field currField : declaredFields) {
currField.setAccessible(Boolean.TRUE);
// 字段注解
boolean isAttr = currField.isAnnotationPresent(XStreamAsAttribute.class);
boolean isXStreamAlias = currField.isAnnotationPresent(XStreamAlias.class);
boolean isFieldValue = currField.isAnnotationPresent(FieldValue.class); // 当前字段值
Object curFieldValue = currField.get(source); // 字段别名
String xmlAlias;
if (isXStreamAlias) {
xmlAlias = currField.getAnnotation(XStreamAlias.class).value();
} else {
xmlAlias = currField.getName();
} if (isAttr) {
// 字段属性
writer.addAttribute(xmlAlias, null == curFieldValue ? "" : String.valueOf(curFieldValue));
} else if (isFieldValue) {
// 字段值
writer.setValue(String.valueOf(curFieldValue));
} else {
// 字段简单处理
boolean isBaseType = DomainUtil.isBaseType(currField.getType());
if (curFieldValue instanceof List) {
List<Object> list = (List<Object>) curFieldValue;
for (int i = 0; i < list.size(); i++) {
writer.startNode(xmlAlias + i);
Object curr = list.get(i);
isBaseType = DomainUtil.isBaseType(curr.getClass());
if (null == curr || isBaseType) {
writer.setValue(null == curr ? "" : String.valueOf(curr));
} else {
handleSource(curr, writer);
}
writer.endNode();
}
} else {
// 开始节点
writer.startNode(xmlAlias); if (null == curFieldValue || isBaseType) {
writer.setValue(null == curFieldValue ? "" : String.valueOf(curFieldValue));
} else if (currField.getType().equals(Date.class)) { //时间对象
SimpleDateFormat format = new SimpleDateFormat(formatPattern);
writer.setValue(null == curFieldValue ? "" : format.format(curFieldValue));
} else { //对象类型
handleSource(curFieldValue, writer);
} // 结束节点
writer.endNode();
}
}
}
} catch (Exception e) {
LOGGER.error("[FieldConverter] handleSource 异常,{}", e);
throw e;
}
} /**
* 将xml转为java对象使用
*/
@Override
public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
System.out.println("coming.....");
return null;
}
源码参照 GitHub
XStream 1.4.10版本处理xml使用问题的更多相关文章
- 升级 python 2.6.6 系统到 2.7.10 版本
CentOS 6 系统默认 Python 版本是:2.6.6 平时在使用中遇到很多的库要求是 2.7.x 版本的库,比如使用 ConfigParser 库,在 2.6 版本库就不支持没有 value ...
- Windows 10 版本 1507 中的新 AppLocker 功能
要查看 Windows 10 版本信息,使用[运行]> dxdiag 回车 下表包含 Windows 10 的初始版本(版本 1507)中包括的一些新的和更新的功能以及对版本 1511 的 W ...
- 20160303 - 升级 Windows 10 版本 1511 后,文件夹默认打开方式为 cmd 的修复
问题描述:升级 Windows 10 版本 1511 (OS 内部版本 10586.122)后,文件夹的默认打开方式变成了cmd.双击任何一个文件夹,显示相关的提示错误信息如下: [Window Ti ...
- 设置Ubuntu 10.10版本的软件源
设置Ubuntu 10.10版本的软件源 http://blog.csdn.net/xie1xiao1jun/article/details/49911189 网上有很多关于软件源信息的更新,每次 ...
- VS2013+Win10+opencv3.0配置(包括opencv2.4.10版本)
在win下配置opencv3.0.0还是比较简单的,这里简单说一下配置过程:参考链接:http://blog.csdn.net/u010009145/article/details/50756751 ...
- swoole1.8.0+版本异步redis安装(本实例为swoole1.8.10版本)详解
Swoole-1.8.0+版本增加了对异步Redis客户端的支持,基于redis官方提供的hiredis库实现.Swoole提供了__call魔术方法,来映射绝大部分Redis指令(本次安装实例为sw ...
- websocket通讯协议(10版本)简介
前言: 工作中用到了websocket 协议10版本的,英文的协议请看这里: http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotoc ...
- Windows 10 版本信息
原文 https://technet.microsoft.com/zh-cn/windows/release-info Windows 10 版本信息 Microsoft 已更新其服务模型. 半年频道 ...
- 从Ubuntu 18.04 LTS升级到Ubuntu 18.10版本的方法
从Ubuntu 18.04 LTS升级到Ubuntu 18.10版本的方法 2018-10-18 21:08:39作者:ywnz稿源:云网牛站 本文提供从Ubuntu 18.04 LTS(Bionic ...
随机推荐
- npm包的语义版本控制(Semantic Versioning of Packages)
本文删改自Node.js 8 the Right Way Part I Chapter 3 npm 使用语义版本控制(SemVer)来寻找包的最佳可用兼容版本. 以安装测试框架mocha为例 $ ...
- Java开发笔记(一百三十五)Swing的文件对话框
除了常规的提示对话框,还有一种对话框也很常见,它叫做文件对话框.文件对话框又分为两小类:打开文件的对话框.保存文件的对话框,但在Swing中它们都用类型JFileChooser来表达.下面是JFile ...
- iOS核心动画(专用图层篇)
之前的文章我们了解了Core Animation中图层的一些基础知识.没有看过的传送门在此: iOS核心动画基础篇 那么在了解了这些基础知识之后,接下来进入专用图层的了解 苹果为了方便和性能,封装了几 ...
- [洛谷P2056][ZJOI2007]捉迷藏(2019-7-20考试)
题目大意:有一棵$n(n\leqslant10^6)$个点的树,上面所有点是黑点,有$m$次操作: $C\;u$:把点$u$颜色翻转 $G$:问树上最远的两个黑点的距离,若没有黑点输出$0$ 题解:有 ...
- php 中header头的使用
header("content-type:text/html;charset=utf-8");//页面字符集的设置 header("location:index.php& ...
- git重置账号密码
1.打开控制面板(快捷打开win+R,输入control) 2.点击打开用户账户 3.点击凭据管理器 4.点击windows凭据删除你的git凭据即可
- C# vb .net实现HSL调整特效滤镜
在.net中,如何简单快捷地实现Photoshop滤镜组中的HSL调整呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第一 ...
- BUAAOO-Final-Summary
目录 总结本单元两次作业的架构设计 总结自己在四个单元中架构设计及OO方法理解的演进 总结自己在四个单元中测试理解与实践的演进 总结自己的课程收获 立足于自己的体会给课程提三个具体改进建议 两次架构设 ...
- vue+vant-UI框架写的购物车的复选框全选和反选
购物车页面的设计图 商品的列表 代码: <ul v-if="shoppingListData.rows.length"> <li v-for="(ite ...
- 聊聊 ES6 中的箭头函数
首先来两点: 当只有一个参数的时候,那么 () 可以省略 当只有一个 return 的时候,那么 {} 可以省略 当函数体内只有一条语句的时候,那么 {} 也可以省略 下面来几个简单的例子来对比 ES ...