JavaBean和XML相互转换(一)
下一篇文章:JavaBean 和 XML 相互转换(二)
在我们对接第三方系统时,经常会遇到第三方系统的报文采用 XML 格式,这是就需要将 JavaBean 和 XML 相互转换。转换工具
在本示例中 JavaBean 和 XML 相互转换的工具采用 Hutool 提供的 JAXBUtil,所以在使用需要引入 Hutool 依赖,如下示例: cn.hutool hutool-all 5.8.10
JAXBUtil 工具其实是对 javax.xml.bind.JAXBContext 进行了包装
下面通过一些简单示例,介绍 JavaBean 和 XML 相互转换常用到的一些注解,在正式开始介绍之前,先定义一些用于转换的 JavaBean,如下所示:学校类:其包括基本类型字段和集合字段/** * 学校 */ @Data @NoArgsConstructor @AllArgsConstructor @Accessors(chain = true) public class School { /** * 学校名称 */ private String name; /** * 学校联系方式 */ private String phone; /** * 学校地址 */ private String address; /** * 班级 */ private List classes; }班级类:其包括基本类型字段和集合字段/** * 班级 */ @Data @NoArgsConstructor @AllArgsConstructor @Accessors(chain = true) public class ClassInfo { /** * 班级编号 */ private String classNo; /** * 班主任 */ private String teacher; /** * 学生 */ private List students; }学生类:只包括基本类型字段/** * 学生 */ @Data @NoArgsConstructor @AllArgsConstructor @Accessors(chain = true) public class Student { /** * 学号 */ private String no; /** * 学生姓名 */ private String name; /** * 年龄 */ private Integer age; /** * 家庭地址 */ private String address; }@XmlRootElement
标注位置
类
是否必须
必须
注解作用
默认是将当前简单类名作为 XML 的 root 标签,如果设置该注解 name 属性,那么 name 属性值作为 root 标签
测试代码:只需关注只需结果 root 标签差异 public class XmlBeanMapperTest { /** * 测试 {@link XmlRootElement} 注解 */ @Test public void testXmlRootElement() { Student student = new Student("1001", "张三", 25, "北京市长安街 001 号"); Console.log(JAXBUtil.beanToXml(student)); } }未设置 name 属性@Data @NoArgsConstructor @AllArgsConstructor @Accessors(chain = true) @XmlRootElement public class Student { // 省略属性 }
执行结果:<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 北京市长安街 001 号 25 张三 1001 设置 name 属性为 STDENT@Data @NoArgsConstructor @AllArgsConstructor @Accessors(chain = true) @XmlRootElement(name = "STUDENT") public class Student { // 省略属性 }
执行结果:<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 北京市长安街 001 号 25 张三 1001 @XmlType
标注位置
类
是否必须
非必须
注解作用
主要使用其 propOrder 属性,用于对 XML 元素排序,如果设置了 propOrder 属性,那么属性的值要包括所有的待转换的字段@Data @NoArgsConstructor @AllArgsConstructor @Accessors(chain = true) @XmlRootElement @XmlType(propOrder = {"no", "age", "name", "address"}) public class Student { // 省略属性 }
测试代码:public class XmlBeanMapperTest { /** * 测试 {@link XmlType} 注解 */ @Test public void testXmlType() { Student student = new Student("1001", "张三", 25, "北京市长安街 001 号"); Console.log(JAXBUtil.beanToXml(student)); } }
执行结果:// 未添加 @XmlType 注解前 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> 北京市长安街 001 号 25 张三 1001 // 添加后,按照指定的顺序排序 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> 1001 25 张三 北京市长安街 001 号 @XmlAccessorType
标注位置
类
是否必须
非必须
注解作用
用于控制 JavaBean 和 XML 转换字段和元素之间的映射,包括如下四种控制类型:PROPERTY:对 JavaBean 中有 Getter/Setter 方法或使用 @XmlElement 注解标注的属性进行映射FIELD:对 JavaBean 中非 static、transient 修饰的属性进行映射PUBLIC_MEMBER:默认值,对 JavaBean 中 public 修饰或有 Getter/Setter 方法或使用 @XmlElement 注解标注的属性进行映射NONE:仅对 JavaBean 中使用 @XmlElement 注解标注的属性进行映射
注意:当使用 Lombok 中 @Data 注解时,若使用 PROPERTY 或 PUBLIC_MEMBER 类型时会出现异常,如果继续使用 @Data 那么就需要使用 FIELD 或 NONE 类型。
对上面公共的学生类做些修改,详见 Student 类中的注释://@Data 注释 Lombok @Data 注解,不自动生成 Getter/Setter 方法等 @ToString @NoArgsConstructor @AllArgsConstructor @Accessors(chain = true) @XmlRootElement @XmlAccessorType // 根据下面测试的场景,设置对应的值 public class Student { /** * 学号:有 Getter/Setter 方法(通过 Lombok @Getter/@Setter 注解, * 或手动编写 Getter/Setter 方法) */ @Getter @Setter private String no; /** * 学生姓名:将原 private 修饰改为 public 修饰,也就是通过类实例就可以访问该变量 */ public String name; /** * 年龄:使用 @XmlElement 注解,现在可以先了解该注解是用于类属性和 XML 标签映射, * 后面详解 */ @XmlElement private Integer age; /** * 家庭地址:private 修饰的变量没有 Getter/Setter 方法 */ private String address; }
测试类:public class XmlBeanMapperTest { private static final String XML = "<?xml version="1.0" encoding="UTF-8" standalone="yes"?> " + " " + " 北京市长安街 001 号 " + " 25 " + " 张三 " + " 1001 " + ""; /** * 测试 {@link XmlAccessorType} 注解 */ @Test public void testXmlAccessorType() { Student student = new Student("1001", "张三", 25, "北京市长安街 001 号"); Console.log(JAXBUtil.beanToXml(student)); Console.log(JAXBUtil.xmlToBean(XML, Student.class)); } }PROPERTY
运行测试类,执行结果如下:<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 25 1001 Student(no=1001, name=null, age=25, address=null)
可以看到当注解 @XmlAccessorType value=PROPERTY 时, JavaBean 和 XML 相互映射,只有有 Getter/Setter 方法或标注 @XmlElement 注解的属性生效。FIELD
运行测试类,执行结果如下:<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 1001 张三 25 北京市长安街 001 号 Student(no=1001, name=张三, age=25, address=北京市长安街 001 号)
可以看到当注解 @XmlAccessorType value=FIELD 时, JavaBean 和 XML 相互映射,学生类中的字段都生效PUBLIC_MEMBER
运行测试类,执行结果如下:<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 张三 25 1001 Student(no=1001, name=张三, age=25, address=null)
可以看到当注解 @XmlAccessorType value=PUBLIC_MEMBER 时, JavaBean 和 XML 相互映射,只有有 Getter/Setter 方法或标注 @XmlElement 注解或 public 修饰的属性生效。NONE
运行测试类,执行结果如下:<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 25 Student(no=null, name=null, age=25, address=null)
可以看到当注解 @XmlAccessorType value=NONE 时, JavaBean 和 XML 相互映射,只有有 @XmlElement 注解属性生效。
由于内容较多,其他内容详见下一篇文章,如果文章对大家有所帮助,欢迎点赞、关注、评论。
蔡明,终究为她的毒舌付出了代价文小昕编辑小昕啊,我是谁不重要,都是千年的狐狸你给我玩儿什么聊斋呀!凭着犀利的台词,蔡明在2013年再次爆红,让自己的春晚事业再上一步,在此之前,她已经制霸春晚舞台二十多年。可谁都
港娱荟谈全盛的1992年香港电影从70年代自李小龙功夫片开始到90年代初期,无论是市场还是质量都呈现上涨趋势。特别是1992年,这一年是香港电影近20年发展最好的一年,那一年共上映了超200部电影,本土累
迪士尼翻车!这美人鱼还不如异形!求求你不要辣眼睛了还记得之前被众人吐槽的由迪士尼出品的经典动画改编的真人版小美人鱼吗?没错,你们没听错,它真的要来了!就在前两天,迪士尼官方正式放出小美人鱼真人版中文预告,而主演正是此前被大家吐槽的
甘肃台向CCTV2看齐,在全国34个省级卫视中唯一举办了315晚会甘肃台向CCTV2看齐,在全国34个省级卫视中唯一举办了315晚会聚焦艺人最新动态,传递圈内主流声音。晓今娱全网特供今日头条独家首发,严禁转载本文由晓今娱原创,欢迎关注,带你一起长
求求了,别再逼刘亦菲了!头条创作挑战赛最近,全网都被杨紫琼刷屏了!在第95届奥斯卡颁奖典礼上,她夺得了奥斯卡影后的桂冠。至此,成为了该历史上第一位华人影后。而与此同时,内娱也掀起了轩然大波。看到杨紫琼的成
勇敢美女复仇的故事我看了复仇战姬,感觉太震撼了!这部电影讲述了一个女孩为了复仇而不断成长的故事。每个角色都有自己的故事和性格,让人不禁为她们的遭遇感到心疼。剧情电影以一个惨痛的事件为开端,主角在失去
项目实战C语言easyX带你实现扫雷游戏(六边形升级版)!每天一个编程小项目,提升你的编程能力!程序简介扫雷游戏升级版!六边形扫雷(寻宝模式)稍稍介绍一下哈他也是要把所有安全的地方点出来。他没有扫雷模式的消零算法。每一个安全的点都需要单独
收手吧蒋雯丽!别再折磨观众眼睛了,57岁演朱茵女儿雷人又无脑几天前,狂飙二轮上星大结局,接下这一大盘的则是都市情感剧转角之恋。本以为大爷大妈就爱看这一类狗血言情,没想到,从第一集后,此剧收视一路狂跌,连不常上网的叔叔辈阿姨辈都站出来吐槽上次
美银行倒闭目的曝光!拜登剧本早已写好,只差演员进场了又一轮表演即将拉开帷幕,戏台已经搭好,只差演员就位。近段时间,美国经济持续走下坡路,多家银行倒闭。许多人为此欢欣鼓舞,觉得美国这座大山岌岌可危了。但瘦死的骆驼比马大,美国赫赫煌煌了
狂飙配角演员开直播,被骂跪着赚钱?你们都省省心吧!文M娱乐编辑M娱乐今年开年大戏的狂飙,大家都看了吗?剧里的收视率一路狂飙,剧外的配角演员也一直在狂飙。不过这里狂飙,可不是什么好词,有人称之为跪着赚钱,无底线捞金。疯驴子狂开直播起
三年沉浮,宋城演艺能否重回巅峰?历经三年沉浮,文旅演艺市场也等来了久违的烟火气。这三年,宋城演艺的业绩也随着疫情的好坏一路起伏,疫情初期出现上市十来以来首次出现亏损,2021年宋城演艺凭借创新变革业绩扭亏为盈,而
湖人后卫成灾,为什么还要签下没人要的施罗德?湖人官方已经官宣了正式签下丹尼斯施罗德的消息,双方达成了一份一年264万的合同,意味着施罗德时隔一年辗转多支球队之后重返湖人。施罗德之前在湖人的一年效力经历并不算成功,如今的湖人更
警钟长鸣在九一八警钟敲响的时刻胡世宗今年九月十八日九时十八分,在沈阳城区内都会听到警钟敲响和警笛长鸣的警醒市民的响彻长空的声音,规定停驶鸣笛的九条路十八条街,教育人民勿忘国耻,振兴中华,警
来泡一次温泉,了解一个新商河商河有三宝,豆腐炮肉与蒸枣,近段时间,商河三宝火爆出圈话题迅速在抖音短视频平台爆火,时人尽知蒸枣香甜,却鲜有人知其一语双关亦指蒸澡,商河温泉名满天下,是全国最大的地下热水存储地,在
沉醉那拉提草原谢锐勤去过漫无边际的那曲草原,只见草绿不见树,以为这就是草原的正宗到过遮天蔽日的林芝林场,所见皆古树参天,想当然这就是森林的正派。草原与森林互不掺杂,各自安好,直至来到那拉提草原,
湘西竟然还藏着这样的千年古镇?没去过的人走起来头条创作挑战赛几年前因为工作问题,经常往返长沙和湘西。一次去需要6个多小时,看到路两旁湘西红石林芙蓉镇的广告牌,车开始频繁穿梭山洞的时候,就知道,离目的地不远了,离挂在瀑布上的古镇
与铁路人相爱,是一种什么样的体验?今天是七夕节在这氤氲着爱情气息的传统节日有心动,有陪伴,有表达万千故事里爱情的样子不会只有一种定义今天小编带大家看一看那些与铁路人相爱后想说却没说出来的话奇怪的路痴我查一下咱们旅行
中秋假期本地游市场量价齐升上市旅企全年业绩或将分化本报记者李乔宇见习记者许林艳今年中秋节假期的旅游市场仍然是属于本地游的。经文化和旅游部数据中心测算,2022年中秋节假期,全国国内游出游7340。9万人次,同比下降16。7,按可比
再游老淮安今天我走了趟了老淮安,和平时不同的是我是骑电动车去的。本来以为骑电动车跑不了那么远的路,结果稳稳当当到了那里。走的时候我原先选择的是走承德路,从市传染病医院过去。谁知我的手机导航忽
五峰建成200公里原野生态廊道路面整洁宽敞安防设施齐全金秋时节,蜿蜒曲折的351国道彩带般坠落在宜昌五峰群山间。351国道从浙江台州至四川小金县,横穿宜昌五峰土家族自治县,178公里沿途景色壮美,也是五峰原野生
开业仅两年,海螺沟超美的温泉民宿毁了来源外滩设计酒店9月5日傍晚,我在朋友圈看到一组照片。如果没有说明,我可能会以为这是从工地到一家民宿诞生的过程。只可惜,这9图记录的,是地震前后的海螺沟寂野温泉。摄影子赋图现在的寂
精致女性必不可少的香氛护手霜推荐绝不撞香是我的傲娇有一句出卖年龄的话别让你的双手出卖了你的年龄。说真的,也是这几年才让我深有体会能出卖年龄的双手基本就是辛勤劳作的双手,譬如干活时接触粗糙的木石金属化学成分风吹日晒,以及洗涤。这里要