JavaBean和XML相互转换(二)
上一篇文章:JavaBean和XML相互转换(一)
在上一篇文章中我们介绍了JavaBean和XML相互转换使用的工具和相关注解(XmlRootElement、XmlType、XmlAccessorType),在本篇文章中继续学习其他相关注解。
本篇测试使用的JavaBean同《JavaBean和XML相互转换(一)》,为了方便大家阅读,在本篇冗余之前的代码,如下:学校类:其包括基本类型字段和集合字段学校DataNoArgsConstructorAllArgsConstructorAccessors(chaintrue)publicclassSchool{学校名称privateStringname;学校联系方式privateStringphone;学校地址privateStringaddress;班级privateListClassInfoclasses;}班级类:其包括基本类型字段和集合字段班级DataNoArgsConstructorAllArgsConstructorAccessors(chaintrue)publicclassClassInfo{班级编号privateStringclassNo;班主任privateStringteacher;学生privateListStudentstudents;}学生类:只包括基本类型字段学生DataNoArgsConstructorAllArgsConstructorAccessors(chaintrue)publicclassStudent{学号privateStringno;学生姓名privateStringname;年龄privateIntegerage;家庭地址privateStringaddress;}XmlElement
标注位置
FIELD,METHOD,PARAMETER
是否必须
非必须
注解作用JavaBean属性和XML标签相互映射,该注解主要讲解两个属性:name:JavaBean属性与该属性指定的XML标签映射,如果未设置,默认为JavaBean属性名称type:当注解标注的属性为接口或父类时,转换时需要指定实现类或子类的类型,否则无法转换
使用该注解的场景一般是XML标签与相应的JavaBean属性名称不同,或JavaBean属性类型为接口或父类测试name属性
修改学生类,给address属性添加注解,其他不变,如下所示:DataToStringNoArgsConstructorAllArgsConstructorAccessors(chaintrue)XmlRootElementXmlAccessorType(XmlAccessType。FIELD)publicclassStudent{省略不变的属性家庭地址XmlElement(nameADDRESS)privateStringaddress;}
测试代码:publicclassXmlBeanMapperTest{privatestaticfinalStringXMLlt;?xmlversion1。0encodingUTF8standaloneyes?student北京市长安街001号address25agename张三nameno1001nostudent;测试{linkXmlElement}注解TestpublicvoidtestXmlElement(){StudentstudentnewStudent(1001,张三,25,北京市长安街001号);Console。log(JAXBUtil。beanToXml(student));Console。log(JAXBUtil。xmlToBean(XML,Student。class));}}
执行测试代码,结果如下:lt;?xmlversion1。0encodingUTF8standaloneyes?studentno1001noname张三name25age北京市长安街001号ADDRESSstudentStudent(no1001,name张三,age25,addressnull)
通过上面测试结果可以看到,JavaBean转XML后,address属性对应XML的标签为ADDRESS。反之XML字符串中address标签也无法映射到address属性上。测试type属性
创建装扮接口BaseDress:装扮接口XmlAccessorType(XmlAccessType。FIELD)publicinterfaceBaseDress{}
因为在本示例中使用LombokData注解,所以需要将注解XmlAccessorTypevalue设置为FIELD,而且该注解具有继承性(注解使用Inherited元注解),为了不用每个实现类重复添加,所以在接口上统一添加该注解。
修改学生类,添加类型为BaseDress的新属性dress,如下所示:DataToStringNoArgsConstructorAllArgsConstructorAccessors(chaintrue)XmlRootElementXmlAccessorType(XmlAccessType。FIELD)publicclassStudent{不变的属性省略装扮XmlElement(typeNurseDress。class)privateBaseDressdress;}
因为dress属性的类型是接口,JAXB无法处理接口类型的属性,所以需要使用XmlElement注解type设置对应实现类的类型。这就造成我们无法使用Java多态特性。
新增BaseDress实现类NurseDress,如下所示:护士装扮DataToStringNoArgsConstructorAllArgsConstructorAccessors(chaintrue)publicclassNurseDressimplementsBaseDress{上衣privateStringblouse;裙子privateStringskirt;}
测试代码如下:publicclassXmlBeanMapperTest{测试{linkXmlElement}注解TestpublicvoidtestXmlElement(){StudentstudentnewStudent(1001,张三,25,北京市长安街001号,newNurseDress(红色上衣,绿色裙子));Console。log(JAXBUtil。beanToXml(student));}}
运行测试类,结果如下:lt;?xmlversion1。0encodingUTF8standaloneyes?studentno1001noname张三name25age北京市长安街001号ADDRESSdressblouse红色上衣blouseskirt绿色裙子skirtdressstudentXmlElements
在XmlElement测试中,有个问题就是如果类的属性类型为接口或抽象类,必须使用XmlElement注解type属性指定实现类或子类类型,否则会抛出异常信息。这样不能使用多态,失去了定义接口或抽象类的意义,有一种妥协的方法就是使用XmlElements注解,如下示例。
在XmlElement测试类基础上,新增BaseDress实现类MaidDress,如下所示:女仆装扮DataToStringNoArgsConstructorAllArgsConstructorAccessors(chaintrue)XmlRootElement(namejar)publicclassMaidDressextendsBaseDress{上衣privateStringblouse;裙子privateStringskirt;}
修改学生类,修改dress属性注解,如下所示:DataToStringNoArgsConstructorAllArgsConstructorAccessors(chaintrue)XmlRootElementXmlAccessorType(XmlAccessType。FIELD)publicclassStudent{不变的属性省略装扮XmlElements({XmlElement(typeNurseDress。class),XmlElement(typeMaidDress。class)})privateBaseDressdress;}
将XmlElement注解更换为XmlElements注解,并设置其value属性为可能赋值的BaseDress接口实现类类型数组
运行测试类,测试结果如下:lt;?xmlversion1。0encodingUTF8standaloneyes?studentno1001noname张三name25age北京市长安街001号addressdressblouse红色上衣blouseskirt粉红色裙子skirtdressstudentStudent(no1001,name张三,age25,address北京市长安街001号,dressnull)
可以正常执行,只要赋值的类型在指定的XmlElement数组中,就可以映射XmlTransient
标注位置
FIELD,METHOD,TYPE
是否必须
非必须
注解作用
JavaBean属性和XML标签相互映射是忽略标注该注解的属性
修改学生类,在address属性上添加该注解,如下所示:DataToStringNoArgsConstructorAllArgsConstructorAccessors(chaintrue)XmlRootElementXmlAccessorType(XmlAccessType。FIELD)publicclassStudent{不变的属性省略家庭地址XmlTransientprivateStringaddress;}
测试类如下:publicclassXmlBeanMapperTest{privatestaticfinalStringXMLlt;?xmlversion1。0encodingUTF8standaloneyes?student北京市长安街001号address25agename张三nameno1001nostudent;测试{linkXmlTransient}注解TestpublicvoidtestXmlTransient(){StudentstudentnewStudent(1001,张三,25,北京市长安街001号);Console。log(JAXBUtil。beanToXml(student));Console。log(JAXBUtil。xmlToBean(XML,Student。class));}}
运行测试类,结果如下:lt;?xmlversion1。0encodingUTF8standaloneyes?studentno1001noname张三name25agestudentStudent(no1001,name张三,age25,addressnull)XmlAttribute
标注位置
FIELD,METHOD
是否必须
非必须
注解作用
将JavaBean的属性与XML标签的属性相互映射
修改学生类,在address属性上添加该注解,如下所示:DataToStringNoArgsConstructorAllArgsConstructorAccessors(chaintrue)XmlRootElementXmlAccessorType(XmlAccessType。FIELD)publicclassStudent{不变的属性省略家庭地址XmlAttributeprivateStringaddress;}
测试类同XmlTransient注解中的测试类,运行后结果如下:lt;?xmlversion1。0encodingUTF8standaloneyes?studentaddress北京市长安街001号no1001noname张三name25agestudentStudent(no1001,name张三,age25,addressnull)
通过上面的结果可以看到学生类address属性映射到了XMLstudent标签的address属性
由于内容较多,其他内容详见下一篇文章,如果文章对大家有所帮助,欢迎点赞、关注、评论。
借壳击败北京国安,姚军和他的流浪足球队2022年11月17日,战胜北京国安之后,北海极驰所有的参赛球员拍了一张合照,最后一排右数第三人为俱乐部创始人姚军。(受访者供图图)2022年11月17日,中国足球爆出史上最大冷门
太平寺足球的故事(冬季的寒冷)太平寺足球的故事(冬季的寒冷)享受快乐足球的日子世界杯比赛如火如荼的进行,足球运动进入了一个迷茫的动荡时期,没有了绝对的强队,没有了绝对的弱旅,超级新星暂时未蹦出来,几乎全部队伍都
世界杯1战胜加拿大,以小组第一晋级北京时间2022年12月1日2300,小组赛F组最后一轮比赛,加拿大迎战摩洛哥,齐耶赫帮助球队开局四分钟就取得领先,恩内斯里破门,阿格尔德乌龙,最终摩洛哥21战胜加拿大,以小组第一
C组解套阿根廷后来居上,波兰出线谢沙特谢自己波兰02阿根廷,沙特12墨西哥,C组最后2场比赛彻底解套首轮意外告负的阿根廷两连胜小组头名出线,而沙特在比赛最后关头诠释了纯粹的足球精神,他们补时第5分钟对自己无关紧要的进球帮助今
脾胃出现问题,小腿会提前告诉你,4个现象暗示你关注健康中医认为脾胃是后天之根本,可以控制身体肌肉。换句话说,脾胃健康与否,可以通过我们的小腿来看出来。脾胃有问题的时候,小腿会出现什么表现?1小腿皮肤温度变高当人体出现了脾阳虚的时候,那
吃橙子与喝橙汁哪个更有营养?结论出乎想象可能大家觉得,按常理来说,都觉得喝橙汁应该比吃橙子有营养。猜猜哪个更有营养?其实,在榨完橙汁后,膳食纤维会被过滤掉很大一部分,而且糖分也会超标,对健康有一定的影响。喝橙子与吃橙子,
指压妇科三阴交治痛经痛经,不知折磨了多少女性。难道除了止痛药,就没有别的方法可以缓解痛苦了吗?当然不是。中医有一个三阴交穴,又称女三里妇科三阴交。顾名思义,此穴对妇症甚有疗效,如经期不顺,白带月经过多
冬天用它做主食,养脾健胃,比米饭面条更进补,还能散结节最近天气越来越冷,不少女性朋友就问我,到了冬天怎么进补比较好呢?看来大家都是有这方面的健康养生意识的,今天就来讲讲进补。中医讲冬主收藏,这个时候万物休整,人也应该顺应时令,遵循冬藏
古稀之年谈养生(57)今天我来谈一下(淫)这个人类的大敌!世界上的事情都是两分法,不是一点论。任何事情都是辩证的,既有好的一面也有坏的一面。下面我们来具体地分析一下这个淫!淫,分为正淫和邪淫,什么是正淫
一级致癌物被揪出,世卫组织立即停止食用,管住嘴就是赢一说到癌症可能大多数人都会感觉到非常害怕,因为在人们的认知当中癌症是一种非常可怕的身体疾病,当人们谈论起癌症的时候,往往也会不自觉地提到致癌物。在很多人的认知当中,致癌物往往都是某
从肾论治功能障碍,即使得病了也不要自己吓自己从肾论治功能障碍,即使得病了也不要自己吓自己!中医讲,肾贵为先天之本,藏精主生殖和发育,当肾精充足不仅仅宗筋坚韧不拔,精关亦可坚守,即使偶尔出现痿或者泄也会恢复的很快。所以补肾精,