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

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

赵雅芝的骄傲3个儿子都是学霸,今大儿子44岁,二儿子40岁赵雅芝是大众公认的不老女神,老一辈人心中的白月光。因参加香港小姐选拔走近大家视野,虽然只获得了第四名,但是她的演绎事业发展比前三名好太多了。赵雅芝的演绎生涯中创造出了很多经典的荧幕2022香港小姐再竞选决赛爆冷!走光抢镜状况频出,三甲颜值引争议饿了吗?戳右边关注我们,每天给您送上最新出炉的娱乐硬核大餐!10月14日,有媒体报道,为了庆祝TVB创办55周年制作的特别节目2022年香港小姐再竞选决赛录制完毕,三甲名单也已经曝华为P60Pro麒麟9010芯片华为自研影像,这才是国产旗舰天花板伴随着华为Mate50系列的发布,人们对即将到来的华为P60Pro也充满了期待,近日关于华为P60Pro的曝光也越来越多,感兴趣的朋友不妨来看看吧。核心性能表现据相关博主爆料,这款1。4亿!店大欺客终自欺,苹果又又被巴西罚了要说刚硬刚苹果的国家中,巴西必须有名。10月13日有报道称,巴西圣保罗州法院对苹果公司处以1亿雷亚尔(约合1。36亿元人民币)的罚款,并裁定在该国销售的新iPhone必须配备充电器方向盘居中续航800公里马斯克官宣特斯拉电动卡车投产10月8日消息,特斯拉CEO马斯克发博称非常高兴地告诉大家,特斯拉Semi电动卡车正式投产,并将于12月1日交付给百事公司。它不仅拥有500英里(超800公里)的续航,还能提供非同变身明日达超市,美团优选电商化升级,能否成为美团零售的关键拼图?每经记者杨昕怡每经编辑刘雪梅你好,我是美团优选,一个明日达的超市。10月11日,美团优选在其官方公众号内做了全新的自我介绍。伴随着这一亮相,美团优选的品类定位自此从社区电商转向了明深圳杭州西安全国都在往智能化转型当前,中国正在加速逐步迈入数字经济时代,园区经济,作为调整经济产业结构,集聚产业优势的重要环节,形成了我国地域经济的增长极。根据综合开发研究院的不完全统计,近年来产业园区对全国经济中创新航的突破与困境在中创新航研究院进门的道路上,崭新的新能源汽车列队摆放,这些品牌包括广汽埃安等近十款车型。顶着港股动力电池第一股的光环,中创新航科技股份有限公司成功上市,公开发行2。66亿股,每股港股小米集团的投资逻辑核心观点1虽然多重因素导致业绩承压,但无论从手机营收互联网营收广告营收还是loT营收来讲,都要比2019年的时候好很多。目前股价和历史最低位置几乎一样,也就是说当前位置已经被低估,聚焦特斯拉用内部代码应对测试?EuroNCAP回应未发现作弊证据EuroNCAP回应特斯拉可疑代码没有证据表明其在碰撞测试中作弊文懂车帝原创彩丽美懂车帝原创行业就在一个月前,特斯拉黑客兼软件专家绿神(昵称为Greentheonly)曾在推特上爆HUAWEI公布最新人事任命最新消息!华为公布最新人事任命汪涛李鹏接任企业BG和运营商BG总裁10月12日,在华为官微发布的第十三届全球移动宽带论坛活动宣传片中,李鹏以华为运营商BG总裁的身份对外发声,邀请各
天津口岸一带一路又添新动脉!首次开通哈萨克斯坦阿拉山口天津东南亚铁海联运新航线来源津滨海客户端津滨海讯(记者赵贤钰通讯员董娜摄影报道)日前,在天津新港海关的监管下,最后一车装载着哈萨克斯坦马口铁的列车集货完毕,这批货物将搭乘卓远海昇号轮船驶向最终目的地印度。小米创始人雷军送别父亲,网友爆料细节让人感动前几天刷到一条消息,小米创始人雷军回湖北仙桃老家送别老父亲。刚开始我有点质疑这条消息的真实性,随后看到很多网友纷纷在雷军的微博下留言让雷总节哀,雷军本人或者小米公司也不见出来辟谣,梦幻西游大唐官府闯区第二十六集头条创作挑战赛步入正题上号想自己打两件宝宝装,咔咔两个天眼珠巨亏,不玩了浪子回头,直接买装备花了100W法宝宝的装备秒全了,上一段灵石凑合用法宝宝109过渡用,好的装备我不配花费1聚焦高质量发展连线全球云招商广东连州吹响拼经济奋进号角新华网广州1月3日电(关锦恒)近期,全国掀起拼经济的浪潮,多地忙建设抓生产进度条。在推动连州菜心作为农业主导产业大力发展的同时,广东省清远连州市另辟蹊径,于近日上线连通四海共赢九州原神的神明与角色设计思路如今原神已经开发到3。3版本,大约有2年多时间,游戏内部的构建理论也是趋于成熟,对角色,剧情,运营的掌握也逐渐熟悉,也渐渐的我们可以发现一些规律,如剧情走向,角色设计以及部分运营。围观!百度输入法叶悠悠为习酒强强赋能,用虚拟人撬动新玩法虚拟偶像是近几年兴起的新型科技偶像虚拟人物。而说到虚拟偶像,那么你可能会想起谁呢?虚拟博主柳夜熙超写实虚拟人AYAYI或是百度输入法2022年AI侃侃自从去年以来,元宇宙概念带动这三连胜后,来听听湖人众将都说了什么?NBA常规赛,湖人在主场以112109击退热火,取得三连胜。这是湖人自2020年10月12日以来首次在常规时间内战胜热火,而上一次还是2020年总决赛G6,当时湖人以10693赢球科勒登杂志封面,气质太好!身上纹身曝光,没有前任足迹38岁的科勒卡戴珊(KhloeKardashian),对比过去几年她的名气不减反增,原本和NBA球星奥多姆哈登TT汤普森的恋情,科勒已经在NBA圈内名声大噪。现在,38岁的科勒凭借IQOONeo7竞速版发布和红米K60,荣耀80GT相比,谁才是中端焊门员文小伊评科技随着荣耀80GT红米K60以及IQOONeo7竞速版这三款机型的陆续发布,年前最后一波新机发售潮已经告一段落。和前段机型发布的手机均以高端机不同的是,这一段时间所发布的K60性价比爆棚,配置全面解析,到底表现如何年末重磅产品红米K60系列如期发布,带来的几款产品都非常不错,红米K60E,红米K60以及红米K60Pro等都是非常受欢迎的产品,三款手机可以说都是同价位无敌的感觉了。红米K60极双冠之城本赛季中超女超冠军球队均来自武汉男女足齐夺冠!随着中超联赛官方宣布国安津门虎双双在联赛末轮弃赛,武汉三镇凭借净胜球优势夺得中超冠军,加上此前已经夺得女超冠军的武汉车谷江大女足,本赛季中超女超冠军球队均来自武汉。本赛季武汉三镇在