范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

JavaBean和XML相互转换(二)

  上一篇文章:JavaBean 和 XML 相互转换(一)
  在上一篇文章中我们介绍了 JavaBean 和 XML 相互转换使用的工具和相关注解(@XmlRootElement、@XmlType、@XmlAccessorType),在本篇文章中继续学习其他相关注解。
  本篇测试使用的 JavaBean 同《JavaBean 和 XML 相互转换(一)》,为了方便大家阅读,在本篇冗余之前的代码,如下:学校类:其包括基本类型字段和集合字段/**  * 学校  */ @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; }@XmlElement
  标注位置
  FIELD, METHOD, PARAMETER
  是否必须
  非必须
  注解作用JavaBean 属性和 XML 标签相互映射,该注解主要讲解两个属性:name:JavaBean 属性与该属性指定的 XML 标签映射,如果未设置,默认为 JavaBean 属性名称type:当注解标注的属性为接口或父类时,转换时需要指定实现类或子类的类型,否则无法转换
  使用该注解的场景一般是 XML 标签与相应的 JavaBean 属性名称不同,或 JavaBean 属性类型为接口或父类测试 name 属性
  修改学生类,给 address 属性添加注解,其他不变,如下所示:@Data @ToString @NoArgsConstructor @AllArgsConstructor @Accessors(chain = true) @XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) public class Student {      // 省略不变的属性      /**      * 家庭地址      */     @XmlElement(name = "ADDRESS")     private String address; }
  测试代码:public class XmlBeanMapperTest {      private static final String XML = "<?xml version="1.0" encoding="UTF-8" standalone="yes"?> " +             " " +             "    北京市长安街 001 号 " +             "    25 " +             "    张三 " +             "    1001 " +             "";       /**      * 测试 {@link XmlElement} 注解      */     @Test     public void testXmlElement() {         Student student = new Student("1001", "张三", 25, "北京市长安街 001 号");         Console.log(JAXBUtil.beanToXml(student));         Console.log(JAXBUtil.xmlToBean(XML, Student.class));     } }
  执行测试代码,结果如下:<?xml version="1.0" encoding="UTF-8" standalone="yes"?>      1001     张三     25     北京市长安街 001 号   Student(no=1001, name=张三, age=25, address=null)
  通过上面测试结果可以看到,JavaBean 转 XML 后,address 属性对应 XML 的标签为 ADDRESS。反之 XML 字符串中 address 标签也无法映射到 address 属性上。测试 type 属性
  创建装扮接口 BaseDress:/**  * 装扮接口  */ @XmlAccessorType(XmlAccessType.FIELD) public interface BaseDress { }
  因为在本示例中使用 Lombok @Data 注解,所以需要将注解 @XmlAccessorType value 设置为 FIELD,而且该注解具有继承性(注解使用 @Inherited 元注解),为了不用每个实现类重复添加,所以在接口上统一添加该注解。
  修改学生类,添加类型为 BaseDress 的新属性 dress,如下所示:@Data @ToString @NoArgsConstructor @AllArgsConstructor @Accessors(chain = true) @XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) public class Student {      // 不变的属性省略      /**      * 装扮      */     @XmlElement(type = NurseDress.class)     private BaseDress dress; }
  因为 dress 属性的类型是接口,JAXB 无法处理接口类型的属性,所以需要使用 @XmlElement 注解 type 设置对应实现类的类型。这就造成我们无法使用 Java 多态特性。
  新增 BaseDress 实现类 NurseDress,如下所示:/**  * 护士装扮  */ @Data @ToString @NoArgsConstructor @AllArgsConstructor @Accessors(chain = true) public class NurseDress implements BaseDress {      /**      * 上衣      */     private String blouse;      /**      * 裙子      */     private String skirt; }
  测试代码如下:public class XmlBeanMapperTest {      /**      * 测试 {@link XmlElement} 注解      */     @Test     public void testXmlElement() {         Student student = new Student("1001", "张三", 25, "北京市长安街 001 号",                                        new NurseDress("红色上衣", "绿色裙子"));         Console.log(JAXBUtil.beanToXml(student));     } }
  运行测试类,结果如下:<?xml version="1.0" encoding="UTF-8" standalone="yes"?>      1001     张三     25     北京市长安街 001 号              红色上衣         绿色裙子      @XmlElements
  在 @XmlElement 测试中,有个问题就是如果类的属性类型为接口或抽象类,必须使用 @XmlElement 注解 type 属性指定实现类或子类类型,否则会抛出异常信息。这样不能使用多态,失去了定义接口或抽象类的意义,有一种妥协的方法就是使用 @XmlElements 注解,如下示例。
  在 @XmlElement 测试类基础上,新增 BaseDress 实现类 MaidDress,如下所示:/**  * 女仆装扮  */ @Data @ToString @NoArgsConstructor @AllArgsConstructor @Accessors(chain = true) @XmlRootElement(name="jar") public class MaidDress extends BaseDress {      /**      * 上衣      */     private String blouse;      /**      * 裙子      */     private String skirt; }
  修改学生类,修改 dress 属性注解,如下所示:@Data @ToString @NoArgsConstructor @AllArgsConstructor @Accessors(chain = true) @XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) public class Student {      // 不变的属性省略      /**      * 装扮      */     @XmlElements({             @XmlElement(type = NurseDress.class),             @XmlElement(type = MaidDress.class)     })     private BaseDress dress; }
  将 @XmlElement 注解更换为 @XmlElements 注解,并设置其 value 属性为可能赋值的 BaseDress 接口实现类类型数组
  运行测试类,测试结果如下:<?xml version="1.0" encoding="UTF-8" standalone="yes"?>      1001     张三     25     北京市长安街 001 号              红色上衣         粉红色裙子        Student(no=1001, name=张三, age=25, address=北京市长安街 001 号, dress=null)
  可以正常执行,只要赋值的类型在指定的 @XmlElement 数组中,就可以映射@XmlTransient
  标注位置
  FIELD, METHOD, TYPE
  是否必须
  非必须
  注解作用
  JavaBean 属性和 XML 标签相互映射是忽略标注该注解的属性
  修改学生类,在 address 属性上添加该注解,如下所示:@Data @ToString @NoArgsConstructor @AllArgsConstructor @Accessors(chain = true) @XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) public class Student {      // 不变的属性省略      /**      * 家庭地址      */     @XmlTransient     private String address; }
  测试类如下:public class XmlBeanMapperTest {      private static final String XML = "<?xml version="1.0" encoding="UTF-8" standalone="yes"?> " +             " " +             "    北京市长安街 001 号 " +             "    25 " +             "    张三 " +             "    1001 " +             "";       /**      * 测试 {@link XmlTransient} 注解      */     @Test     public void testXmlTransient() {         Student student = new Student("1001", "张三", 25, "北京市长安街 001 号");         Console.log(JAXBUtil.beanToXml(student));         Console.log(JAXBUtil.xmlToBean(XML, Student.class));     } }
  运行测试类,结果如下:<?xml version="1.0" encoding="UTF-8" standalone="yes"?>      1001     张三     25   Student(no=1001, name=张三, age=25, address=null)@XmlAttribute
  标注位置
  FIELD, METHOD
  是否必须
  非必须
  注解作用
  将 JavaBean 的属性与 XML 标签的属性相互映射
  修改学生类,在 address 属性上添加该注解,如下所示:@Data @ToString @NoArgsConstructor @AllArgsConstructor @Accessors(chain = true) @XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) public class Student {      // 不变的属性省略      /**      * 家庭地址      */     @XmlAttribute     private String address; }
  测试类同 @XmlTransient 注解中的测试类,运行后结果如下:<?xml version="1.0" encoding="UTF-8" standalone="yes"?>      1001     张三     25   Student(no=1001, name=张三, age=25, address=null)
  通过上面的结果可以看到学生类 address 属性映射到了 XML student 标签的 address 属性
  由于内容较多,其他内容详见下一篇文章,如果文章对大家有所帮助,欢迎点赞、关注、评论。

新赛季恐寝食难安的八大球星,勇士忍痛割爱,爵士不破不立天下熙熙,皆为利来,天下攘攘,皆为利往。在物欲横流的商业联盟时代,球员之间的交易,早已成为司空见惯的常态。从年轻的落选秀传奇伍德再到爵士双煞,自由市场上从来不缺少年轻亦或者顶级球星美媒对西部15支球队2223赛季的实力进行排名勇士第一湖人第八距离202223赛季的NBA赛季开始还有不到一周的时间,西部金州勇士和洛杉矶湖人都是联盟最受欢迎的球队之一。因此,美媒FadeawayWorld也是对西部15支球队202223赛季克莱格林复出!勇士被逆转以112119不敌掘金本场比赛最大的看点是格林和普洱两人的关系!不过他俩今天场上居然有互动了,这是没事了?克莱本赛季首次代表球队出战季前赛,回归首球就是接追梦助攻三分命中!而且接连命中三分手感火热,比赛王海旭忠诚拼搏锻造过硬实力王海旭在演训中。田越洋摄(新华社发)子夜,一场多军兵种检验性对抗演练拉开帷幕。驻香港部队某部分队装备车辆集结编队,迅速抢占阵地做好战斗准备。听着作战参谋的报告,分队长王海旭紧盯着雷我超,iPhone15!也许是手机里面最漂亮的刘海?魅族X8测评不得不说,魅族尽管目前已经半死不活,但是在很多的方面,确实是遥遥领先。比如小刘海和小水滴的设计,对于魅族note9那个小水滴的设计我确实是难以认同,小的水滴反而看着更加碍眼了,但是全红禅换新发型!恩师陈若琳操刀,出征跳水世界杯,或解锁大满贯头条创作挑战赛距离2022年德国柏林跳水世界杯只剩下最后的5天时间,世界各国跳水队都将在近日启程前往德国,准备参加这个跳水运动最高级别单项赛事。就在近日,咱们中国跳水梦之队内人气最世界杯首支出线队诞生!德国60造超级惨案,中国女足拿6分晋级U17女足世界杯第二轮小组赛全面开打,夺冠热门德国女足踢出一场大比分胜利,最终60狂胜智利女足,提前一轮锁定小组前二,成为本届世界杯首支出线的球队。中国女足将在10月15日晚7点对卫冕冠军遭打击!曝法国铁腰因伤无缘世界杯,后防线恐失两大屏障法国中场坎特的伤势恢复情况不容乐观,他将会缺席11月在卡塔尔开幕的世界杯。自从8月14日英超第二个比赛日过后,坎特就因为腘绳肌受伤没有再为切尔西出场。如今看来,他的恢复期恐怕还将延连赢5局,王曦雨20击败西班牙名将,挺进纳波卡站女单四强北京时间10月15日凌晨,WTA250克卢日纳波卡赛女单四强出炉,中国金花王曦雨表现出色,凭借第一盘的连赢5局和第二盘的连赢4局,20击败了西班牙名将迪亚斯,昂首挺进四强。这是王曦世界杯奖杯已经准备好了,纯手工打造国际足联世界杯将在不寻常的时间和不寻常的地方举行。然而,所有球迷的注意力都会被引向一个常见的问题谁将拿下世界杯?距离卡塔尔锦标赛开始还有一个多月,珍贵的杯子已经准备就绪。该奖项在位U17女足迎战哥伦比亚,有望杀出重围闯入八强10月15日晚U17世界杯中国迎来第二个对手哥伦比亚队。哥伦比亚无论技术节奏还是对抗都远远强于我们,想胜利也是非常困难,但是我们的小花非常有韧性和拼劲,上场对阵墨西哥这只世界亚军球
1700名佣人,每年花25亿日元,日本皇室待遇大幅下降,太拮据了目前世界上现存的皇室大概25个,主要分布在亚洲的日本泰国文莱尼泊尔等,欧洲的英国荷兰等,英国皇室出现在公众视野的概率比较高,让大家对皇室有了一些了解,总体而言可以用奢华,不可比拟来名妓资助报业巨头,为爱甘愿做妾,死前留下遗嘱不葬在丈夫身边一个是民国时期的报业巨头,一个是不幸堕入风尘的名妓,他们俩人相识于偶然,却演绎出一段凄美的爱情悲歌。沈秋水是晚清时期上海滩上一个名气不响,但颇有内涵的艺妓。因为家境贫寒,沈秋水幼时严仁美因貌美被日本人惦记,离个婚,上海滩三大财阀出手相助民国是一个特别的时期,这一时期民众开始觉醒,被压迫了千年的女性也接受到了新思想的熏陶,虽然那时的女性在婚姻上依旧没有完全的自主权,但已经有了不少女性敢于反抗命运的不公。民国时期的严多尔衮手握大权,为何一生不敢称帝?权力是不少男人毕生的追求,战功赫赫的多尔衮在早期也痴迷于追求权利。后来皇太极去世,他凭借功高成为了最有可能继承皇位的人。令人意外的是思考了许久后手握大权的多尔衮竟然甘愿让6岁的顺治刘禅是三国中最聪明的吗?1刘禅不是三国里最聪明的人,刘禅的才能相当于普通人中比较聪明的,但没有济世大才。2三国最聪明的是郭嘉。此人曾属袁绍集团,袁绍对郭嘉等人极为敬重,厚礼待之,郭嘉却知其必不能成事,不以喜迎二十大中国共产党历次全国代表大会回顾之中共十大1921年至今,中国共产党举行了十九次全国代表大会,为中国革命确立了新民主主义革命的正确道路为中国人民推翻了帝国主义封建主义官僚资本主义的三座大山为中华民族开启了发展进步的新纪元。庐山会议上,董必武表示我思想觉悟低,没有看出彭德怀反党1959年七月,中央政治局决定在江西省庐山召开中央扩大会议,周恩来,邓小平,林彪,董必武等均出席。这次会议也被称为庐山会议。庐山会议旧址,当时是庐山人民剧院会议最开始是反思大跃进期最神秘的红色女特工,潜伏敌营14年未暴露,一直活到2010年活95岁在我党艰苦漫长的斗争历程中,相对于与敌人正面作战的公开战场,还有一条为夺取革命最终的胜利起到重大作用的隐蔽战线。1942年11月的一天,国民党五届十中全会在重庆召开,前来参加会议的风云帐下奇儿在李存勖扬名立万的三垂冈及柏乡之战(上)优质内容我来评英雄立马起沙陀,奈此朱梁跋扈何。只手难扶唐社稷,连城犹拥晋山河。风云帐下奇儿在,鼓角灯前老泪多。萧瑟三垂冈下路,至今人唱百年歌。这首诗是清朝诗人严遂成著名的咏史诗,称76年毛主席逝世后,徐向前打开其留下的绝密电报,徐帅罕见失态毛主席凭借着自己的战略部署以及长远的目光,让徐向前,朱老总彭大元帅等一众元帅对其敬佩有加。而主席与十大元帅之间也是能把后背交给对方的好兄弟,他们之前的感情是在战火纷飞的岁月中共同磨两次出错牌,痛失80国土,现认清形势,绝不彻底倒向西方对于欧洲而言,20世纪可谓是风云激荡的一个历史时代。两次世界大战,彻底改变了欧洲的势力版图。在激烈的变革与战争中,传统的君主制帝国纷纷瓦解,新兴的民族主义国家快速崛起。其中,有一个