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

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 属性
  由于内容较多,其他内容详见下一篇文章,如果文章对大家有所帮助,欢迎点赞、关注、评论。

流行了上千年的农村自酿酒,为啥以前喝着没事,现在却说有害流行了上千年的农村自酿酒,为啥以前喝着没事,现在却说有害若问农村人最爱喝什么?那当然是自酿酒!与如今的品牌酒比,农村自酿酒,在农村地区可以说流行了上千年了,其最主要的特点便是便宜。在千年古刹北京怀柔红螺寺,遇见樱花海幽香艳丽开满山,落英缤纷美如画。连日来,怀柔红螺寺景区的早樱进入了最佳观赏期,美不胜收的樱花大道成了一片樱花海洋。漫天飞舞的粉白樱花花瓣,不时带来一场沾衣不染的花雨,温馨又浪漫因品嘉陵江小三峡之一的温塘峡,风光绝美,峡谷绝壁间有一条千年古道说起长江三峡,大家肯定都是耳熟能详的,可是你知道吗,其实嘉陵江也有个小三峡哦?嘉陵江小三峡以北碚为中心,由沥鼻峡温塘峡观音峡组成,全长27公里。上为沥鼻峡,中是温塘峡,下有观音峡,ampampquot奥运冠军ampampquot孙杨为游泳遍体鳞伤险残废,后打破世界纪录无人超越1被薛之谦当众指出身体缺陷后,高达两米的孙杨当场泪崩。但孙杨的眼泪不代表埋怨,而是在感谢薛之谦的仗义执言。没有指纹的孙杨不喜欢出国,因为他做不到跟正常人一样按通关指纹他也不敢弄丢任41,提前杀死悬念!欧冠6冠王稳了,预定4强席位,克洛普不庆祝北京时间4月14日凌晨,欧冠14决赛次回合迎来一场比赛,利物浦主场对阵本菲卡。首发轮换7人的利物浦,依然压制本菲卡,科纳特上半场第21分钟的破门,帮助利物浦总比分41领先,提前杀死在欧洲五大联赛拿100分有多难?一只手都数得过来欧洲五大联赛是世界上足球水平最高的联赛,竞争激烈,高手云集,无论是运动员还是教练员都在五大联赛发挥自己的能力。在五大联赛中,也有着众多豪门,他们在联赛中呼风唤雨,但是有一项记录是他灭霸降临?丁俊晖成种子选手最不愿抽到的人,赵颜哥,别过来北京时间4月13号,目前世锦赛资格赛第四轮比赛已全面开打,丁俊晖在一度47落后的情况下连追6局逆转元老世锦赛冠军利里成功晋级正赛周跃龙在取得20完美开局的情况下被马奎尔逆转,攻防两刘玉栋李楠都是大校军衔,为何王治郅仅为中校?差点军籍都难保留说到有军籍的中国运动员,大家一定熟悉刘国梁刘玉栋郑海霞王治郅等等这些八一老队员,但其中王治郅却有点不一样,他的军衔与前几位相比要低,甚至还不如李楠阿的江等人,那么这究竟是什么回事呢官方艾克森加盟巴乙球队格雷米奥,签约至2022年底直播吧4月13日讯官方消息,艾克森加盟巴乙球队格雷米奥,签约至2022年11月30日。根据媒体人寒冰此前的报道,艾克森还有优先续约1年的权利,而他的年薪不会超过585万巴西雷亚尔(破案了!广东与辽篮关系不错,易建联为何在比赛中竖下拇指?北京时间4月13日,CBA季后赛继续进行,在昨晚结束的一场焦点战上,辽宁男篮凭借着多点开花轻松击败卫冕冠军广东,取得大比分10的领先。由于本场任骏飞与外援莱多休战,广东男篮在缺少两宿命对决?杜锋季后赛使出杀手锏,助阿联圆梦总冠军又到了一年季后赛,广东再次对位辽宁,感觉今年比前两年对阵辽宁更加艰难,但是有了前两年不被看好的情形下夺冠还是对广东有信心。首先是阵容方面辽宁人员充裕,各个位置没有明显弱势广东阿联周
安卓用户年底怎么选耳机?苹果直接略过,这四款国产实力不俗!自从几年前TWS耳机让苹果带火以后,平均一年推出一代新品,而国产安卓TWS耳机也在快速迭代,尤其是在2022年里,我们看到了各大手机厂商都在持续发力各自旗下的TWS耳机产品,从过去武汉青创贷让学子与城市精准双向奔赴武汉青创贷青年因城市而聚,城市因青年而兴。数据显示,创业之城武汉已连续5年成为人才净流入城市,且占比逐年增加,跻身中国最具人才吸引力城市前十。百万大学生留汉创业就业工程启动5年来,76人11393活塞喜提六连胜,有了恩比德哈登一节就可以撂倒对手今日NBA常规赛,费城76人在主场轻松地以11393战胜东部垫底的底特律活塞喜提六连胜。目前以18胜12负紧随篮网(2012)位居东部第五。对于目前状态正佳的76人来说,解决活塞这井柏然出生28天被弃,60岁奶奶捡废品将他养大,爆红后父母来认亲头条创作挑战赛他是靠垃圾养大的孩子。人生的前十几年光阴,他在爷爷奶奶堆满废品的家里长大,父母每每带给他的只有失望。16岁的他,在向父亲要钱为奶奶看病时,得到的是一声响彻天空的滚,好就连社交王者微信,似乎也难逃商业化的命运提起微信,似乎任何分析都离不开张小龙此前所说过的种种言论。但事实证明,无论是中国最懂产品的张小龙,还是曾经作为用完即走工具的微信,在经历了多年的产品不断迭代后,曾经的初心和产品定位Soul莫比乌斯发售成绩亮眼社交元宇宙频传佳讯Soul作为国内首个提出社交元宇宙概念的产品,在提出社交元宇宙概念一年之后,Soul又为Z世代带来了全新玩法,这也是Soul首个数字藏品莫比乌斯系列,这款莫比乌斯能为Z世代带来更优李响探秘INNODAY展馆,OPPO自研实力引惊叹,科技为人太暖了!近年来,中国智造品牌企业不断发展壮大,国产品牌的创新能力和技术实力在全球范围内的影响力正在不断扩大。在这种背景下,央视网巨量引擎联合推出了了不起的中国智造,聚焦品牌成就,为国产品牌罗永浩做锤子手机各种嘚瑟网上上蹿下跳为让资源关注我来源快科技距离罗永浩宣布退出所有社交平台全力进军AR创业,已经过去半年了。上个月,他的新公司细红线科技宣布获得一笔5000万美元的昂贵天使轮融资,由美团龙珠领投,蓝驰联想等机构跟投合合信息与上大社会学院联合用AI技术挑战古彝文识别难关12月21日,静安知名科技企业合合信息公司与上海大学社会学院签署校企合作协议,双方将合力完成以国家珍贵古籍西南彝志为中心的贵州古彝文图像识别及数字化校对项目(简称古彝文数字化项目)技巧篇算法小白如何快速且高效的刷力扣题?算法萌新在刷力扣时,虽然已有一些算法基础但仍然出现一题都做不出来的现象,经常有以下困惑1。代码写了又删删了又写,写到一半才发现逻辑走不通,没有整体思路。2。不能分析出题目需要用到什年终策划一卡通关!2022硬核突破自由展翅的C919大飞机三室两厅的中国空间站蜿蜒在沙漠中的钢铁巨龙2022年的中国硬核突破纷纷亮相每一项突破和成就的背后都凝结着无数科技工作者忘我奋斗拼搏的身影!下滑获取今年限定版