使用JAXB包实现bean和xml的互转

举报
码农飞哥 发表于 2021/05/29 13:22:03 2021/05/29
【摘要】 前言 由于项目需要,调用第三方接口,接口返回格式为xml格式。遂用上了javax.xml 用于实现Bean和xml互转 首先我们看看工具类XmlUtil /** * XML转对象 * * @param xmlStr xml字串 * @param t 对象类型 * @return 对象 */ public static <T> T xmlToBean(...

前言

由于项目需要,调用第三方接口,接口返回格式为xml格式。遂用上了javax.xml 用于实现Bean和xml互转
首先我们看看工具类XmlUtil

  /** * XML转对象 * * @param xmlStr xml字串 * @param t 对象类型 * @return 对象 */ public static <T> T xmlToBean(String xmlStr, Class<T> t) { try { //特殊字符不让其转义,不然会报错 if (xmlStr.contains("&#xB;")) { xmlStr = xmlStr.replace("&#xB;","<![CDATA[&#xB;]]>"); } JAXBContext context = JAXBContext.newInstance(t); Unmarshaller unmarshaller = context.createUnmarshaller(); StringReader reader = new StringReader(xmlStr); SAXParserFactory sax = SAXParserFactory.newInstance(); //设置忽略命名空间 sax.setNamespaceAware(false); XMLReader xmlReader = sax.newSAXParser().getXMLReader(); Source source = new SAXSource(xmlReader, new InputSource(reader)); return (T) unmarshaller.unmarshal(source); } catch (JAXBException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (ParserConfigurationException e) { e.printStackTrace(); } return null; } /** * 对象转XML * * @param obj 对象 * @return 字符串 */ public static String beanToXml(Object obj) { ByteArrayOutputStream out = new ByteArrayOutputStream(); try { JAXBContext context = JAXBContext.newInstance(obj.getClass()); Marshaller marshaller = context.createMarshaller();
// marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true); marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.FALSE); marshaller.marshal(obj, out); try { return new String(out.toByteArray(), "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } catch (JAXBException e) { e.printStackTrace(); } return null; }

  
 
  • 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
  • 55
  • 56

代码解释

marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.FALSE); 

  
 
  • 1

如果为true的话,则不会生成<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

使用的Bean

@XmlRootElement(name = "requestXML")
@XmlAccessorType(XmlAccessType.FIELD)
public class TelefenCommonVO { /** * 应用编码 */ @XmlElement(name = "AppID") private String appid; /** * 接入业务 */ private String SPID; /** * 请求流水 */ private String RequestNo; /** * 请求时间 */ private String RequestTime; /** * 签名 */ @XmlTransient private String Sign; public String getAppid() { return appid; } public void setAppid(String appid) { this.appid = appid; } public String getSPID() { return SPID; } public void setSPID(String SPID) { this.SPID = SPID; } public String getRequestNo() { return RequestNo; } public void setRequestNo(String requestNo) { RequestNo = requestNo; } public String getRequestTime() { return RequestTime; } public void setRequestTime(String requestTime) { RequestTime = requestTime; } public String getSign() { return Sign; } public void setSign(String sign) { this.Sign = sign; } public TelefenCommonVO() { } protected TelefenCommonVO(Builder builder) { this.appid = builder.AppID; this.SPID = builder.SPID; this.RequestNo = builder.RequestNo; this.RequestTime = builder.RequestTime; this.Sign = builder.Sign; } public static final class Builder{ /** * 应用编码 */ private String AppID; /** * 接入业务 */ private String SPID; /** * 请求流水 */ private String RequestNo; /** * 请求时间 */ private String RequestTime; /** * 签名 */ private String Sign; public Builder setAppID(String appID) { this.AppID = appID; return this; } public Builder setSPID(String SPID){ this.SPID = SPID; return this; } public Builder setRequestNo(String requestNo){ this.RequestNo = requestNo; return this; } public Builder setRequestTime(String requestTime){ this.RequestTime = requestTime; return this; } public Builder setSign(String sign){ this.Sign = sign; return this; } public TelefenCommonVO build() { return new TelefenCommonVO(this); } }
} 
  
 
  • 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
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123

代码解释

  1. @XmlRootElement(name = "requestXML") 注解是指定xml的根节点,作用在类上
  2. @XmlAccessorType 用于指定有java对象生成xml文件时对java对象属性的访问方式。 它的属性值是XmlAccessType的四个枚举值。分别是:
  • XmlAccessType.FIELD java 对象中的所有成员变量
  • XmlAccessType.PROPERTY java对象中所有通过getter/setter 方式访问的成员变量。
  • XmlAccessType.PUBLIC_MEMBER java 对象中所有的public 访问权限的成员变量和通过getter/setter方式访问的成员变量 。
  • XmlAccessType.NONE java对象的所有属性都不映射为XML元素
  1. @XmlElement
    该注解用在类的属性上。用于将属性映射为xml的子节点,可通过在后面配置name属性值类改变java属性在xml文件中的名称。例如:
 @XmlElement(name = "AppID") private String appid;

  
 
  • 1
  • 2

转化成xml为<AppID></AppID> 而不是<appid></appid>
5. @XmlAccessorOrder
用于对java 对象生成的xml元素进行排序。它有两个属性值:
 AccessorOrder.ALPHABETICAL:对生成的xml元素按字母顺序排序;
 XmlAccessOrder.UNDEFINED:不进行排序
6. @XmlTransient
用于标示在由java对象映射xml时,忽略此属性。即,在生成的xml文件中不出现此元素。
7. @XmlElementWrapper
在注解最外面再加一层,可用于POJO中包含List的属性中,例如:
待转化sql

<responseXML>
  <Details> <Detail> <CardNo>11111</CardNo> <CardPwd>2222</CardPwd> <CodeURL/> </Detail>
  </Details>
</responseXML>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

对应的Bean

@XmlRootElement(name ="responseXML")
@XmlAccessorType(XmlAccessType.FIELD)
public class OrderPayRespVO  { /** * 卡信息列表 */ @XmlElementWrapper(name="Details") @XmlElement(name = "Detail") private List<Detail> Details;
	省略get,set方法
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
@XmlRootElement(name = "Detail")
@XmlAccessorType(XmlAccessType.FIELD)
public class Detail { /** *  卡号 */ private String CardNo; /** * 卡密 */ private String CardPwd; /** * 短链 */ private String CodeURL; 省略get,set方法 }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

转化之后

OrderPayRespVO{Details=[Detail{CardNo='11111', CardPwd='2222', CodeURL=''}]}

  
 
  • 1
  1. 此外该Bean 还使用到了建造者设计模式来实现属性的链式调用。

测试代码

  public static void main(String[] args) throws IOException { TelefenCommonVO commonVO = new TelefenCommonVO.Builder() .setAppID("1112") .setRequestNo("3333") .setSPID("444") .setRequestTime("20180823") .setSign("qqwqwqwq1121") .build(); String xml = beanToXml(commonVO); System.out.println("返回的xml为="+xml); TelefenCommonVO commonVO1 = xmlToBean(xml, TelefenCommonVO.class); System.out.println("转化后的bean为="+commonVO1.toString()); }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

运行结果

返回的xml为=<?xml version="1.0" encoding="UTF-8" standalone="yes"?><requestXML><AppID>1112</AppID><SPID>444</SPID><RequestNo>3333</RequestNo><RequestTime>20180823</RequestTime></requestXML>
转化后的bean为=TelefenCommonVO{appid='1112', SPID='444', RequestNo='3333', RequestTime='20180823', Sign='null'}

  
 
  • 1
  • 2

文章来源: feige.blog.csdn.net,作者:码农飞哥,版权归原作者所有,如需转载,请联系作者。

原文链接:feige.blog.csdn.net/article/details/81981223

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。