惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

G
Google Developers Blog
博客园 - 三生石上(FineUI控件)
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
MongoDB | Blog
MongoDB | Blog
小众软件
小众软件
Y
Y Combinator Blog
博客园 - 聂微东
Google DeepMind News
Google DeepMind News
D
Docker
罗磊的独立博客
Microsoft Security Blog
Microsoft Security Blog
D
DataBreaches.Net
B
Blog
Vercel News
Vercel News
Recent Announcements
Recent Announcements
GbyAI
GbyAI
阮一峰的网络日志
阮一峰的网络日志
T
The Blog of Author Tim Ferriss
H
Hackread – Cybersecurity News, Data Breaches, AI and More
P
Proofpoint News Feed
酷 壳 – CoolShell
酷 壳 – CoolShell
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Microsoft Azure Blog
Microsoft Azure Blog
宝玉的分享
宝玉的分享

祈雨的笔记

安全多方计算MPC spark原理解析 kueue执行源码分析 spark on k8s执行源码分析 spark-operator源码解析 系统压测遇到的缓存击穿问题 我的世界PC与安卓联机 蚂蚁金服流量投放平台的AIG改造 G1大对象致Old区占用率高 日志打印导致接口响应率下跌分析 Groovy加载类导致OOM分析 ERROR日志打印导致CPU满载 记OceanBase死锁超时 应用发版期间服务响应超时 Ark Serverless初探 系统优化复盘一二三 The user specified as a definer does not exist Kong网关初探 API网关选型调研 CPU火焰图常用工具 配置中心选型调研 root操作Nginx导致用户组错误 基于Proxifier使用代理 FastJSON字段智能匹配踩坑 Nacos初探 记一次Nginx服务器CPU满荷载故障 基于券系统分库分表的思考 limit不参与SQL成本计算致索引失效 Linux常用性能监控命令 golang低版本http2偶现400
xml与javaBean转换
祈雨的笔记 · 2019-08-06 · via 祈雨的笔记

maven

1
2
3
4
5
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.11.1</version>
</dependency>

converter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54




@Slf4j
public class XmlStringConverter implements Converter {

private int length;

public XmlStringConverter(int length) {
this.length = length;
}




@Override
public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
String target = format((String) source);
log.debug("java {} -> xml String, source: {}, target: {}", source.getClass(), source, target);
writer.setValue(target);
}




@Override
public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
Class type = context.getRequiredType();
String source = reader.getValue();
String target = parse(source);
log.debug("xml String -> java {}, source: {}, target: {}", type, source, target);
return target;
}

@Override
public boolean canConvert(Class type) {
return String.class.equals(type);
}

private String format(String value) {
if (value.length() >= length) {
return value;
}
return StringUtils.repeat(" ", length - value.length()) + value;
}

private static String parse(String string) {
if (StringUtils.isBlank(string)) {
return null;
}
return string.trim();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52




@Slf4j
public class XmlIntegerConverter implements Converter {

public XmlIntegerConverter() {
}




@Override
public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
String target = format((Integer) source);
log.debug("java {} -> xml String, source: {}, target: {}", source.getClass(), source, target);
writer.setValue(target);
}




@Override
public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
Class type = context.getRequiredType();
String source = reader.getValue();
Integer target = parse(source);
log.debug("xml String -> java {}, source: {}, target: {}", type, source, target);
return target;
}

@Override
public boolean canConvert(Class type) {
return Integer.class.equals(type);
}

private String format(Integer value) {
String string = String.format("%s", value);
if (string.length() < 4) {
string = StringUtils.repeat("0", 4 - string.length()) + string;
}
return string;
}

private static Integer parse(String string) {
if (StringUtils.isBlank(string)) {
return null;
}
return Integer.valueOf(string);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
@Slf4j
public class XmlDateConverter implements Converter {

private String pattern;
public XmlDateConverter(String pattern) {
this.pattern = pattern;
}




@Override
public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
String target = format((Date) source);
log.debug("java {} -> xml String, source: {}, target: {}", source.getClass(), source, target);
writer.setValue(target);
}




@Override
public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
Class type = context.getRequiredType();
String source = reader.getValue();
Date target = parse(source);
log.debug("xml String -> java {}, source: {}, target: {}", type, source, target);
return target;
}

@Override
public boolean canConvert(Class type) {
return Date.class.equals(type);
}

private String format(Date value) {
return DateFormatUtils.format(value, pattern);
}

private Date parse(String string) {
if (StringUtils.isBlank(string)) {
return null;
}
Date date;
try {
date = DateUtils.parseDate(string, new String[]{pattern});
} catch (Exception e) {
throw new RuntimeException(e);
}
return date;
}
}

utils

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
@Slf4j
public class XStreamUtils {

private static final XStream xStream;

private static final String XML_REG = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";

static {

xStream = new XStream(new XppDriver() {
@Override
public HierarchicalStreamWriter createWriter(Writer out) {
return new CompactWriter(out, getNameCoder());
}
});
xStream.ignoreUnknownElements();
xStream.allowTypesByRegExp(new String[]{"com.wakzz.*"});
xStream.processAnnotations(new Class[]{SendRequest.class});
}

public static <T> T parse(String xml, Class<T> clazz) {
try {
return (T) xStream.fromXML(xml);
} catch (Exception e){
log.error("xml转换javabean异常, xml: {}, class: {}", xml, clazz);
log.error(e.getMessage(), e);
}
return null;
}

public static String toXml(Object object) {
return xStream.toXML(object);
}

}

test

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
@Data
@XStreamAlias("appMsg")
public class SendRequest {

@XStreamAlias("appBody")
private SendBody sendBody;

private String version;

@XStreamConverter(value = XmlDateConverter.class, strings = {"yyyyMMddHHmmss"})
private Date reqTime;
}

@Data
public class SendBody {




@XStreamConverter(value = XmlStringConverter.class, ints = {20})
private String orderNo;




@XStreamConverter(value = XmlStringConverter.class, ints = {30})
private String activeNo;




@XStreamConverter(value = XmlIntegerConverter.class)
private Integer num;




@XStreamConverter(value = XmlStringConverter.class, ints = {11})
private String phoneNo;

@XStreamConverter(value = XmlDateConverter.class, strings = {"yyyyMMdd"})
private Date sendTime;

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public static void main(String[] args) {
String xml = "" +
"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
"<appMsg>\n" +
" <appBody>\n" +
" <orderNo>2018081322451475890044</orderNo>\n" +
" <activeNo>jt20180528102410333649</activeNo>\n" +
" <num>0001</num>\n" +
" <phoneNo>15012341234</phoneNo>\n" +
" </appBody>\n" +
" <version>1.0.0</version>\n" +
" <reqTime>20180322152245</reqTime>\n" +
"</appMsg>" +
"";
SendRequest appMsg = parse(xml, SendRequest.class);
System.out.println(appMsg);

String string = toXml(appMsg);
System.out.println(string);
}