JavaBean和XML相互转换(一)
下一篇文章:JavaBean和XML相互转换(二)
在我们对接第三方系统时,经常会遇到第三方系统的报文采用XML格式,这是就需要将JavaBean和XML相互转换。转换工具
在本示例中JavaBean和XML相互转换的工具采用Hutool提供的JAXBUtil,所以在使用需要引入Hutool依赖,如下示例:dependencygroupIdcn。hutoolgroupIdhutoolallartifactIdversion5。8。10versiondependency
JAXBUtil工具其实是对javax。xml。bind。JAXBContext进行了包装
下面通过一些简单示例,介绍JavaBean和XML相互转换常用到的一些注解,在正式开始介绍之前,先定义一些用于转换的JavaBean,如下所示:学校类:其包括基本类型字段和集合字段学校DataNoArgsConstructorAllArgsConstructorAccessors(chaintrue)publicclassSchool{学校名称privateStringname;学校联系方式privateStringphone;学校地址privateStringaddress;班级privateListClassInfoclasses;}班级类:其包括基本类型字段和集合字段班级DataNoArgsConstructorAllArgsConstructorAccessors(chaintrue)publicclassClassInfo{班级编号privateStringclassNo;班主任privateStringteacher;学生privateListStudentstudents;}学生类:只包括基本类型字段学生DataNoArgsConstructorAllArgsConstructorAccessors(chaintrue)publicclassStudent{学号privateStringno;学生姓名privateStringname;年龄privateIntegerage;家庭地址privateStringaddress;}XmlRootElement
标注位置
类
是否必须
必须
注解作用
默认是将当前简单类名作为XML的root标签,如果设置该注解name属性,那么name属性值作为root标签
测试代码:只需关注只需结果root标签差异publicclassXmlBeanMapperTest{测试{linkXmlRootElement}注解TestpublicvoidtestXmlRootElement(){StudentstudentnewStudent(1001,张三,25,北京市长安街001号);Console。log(JAXBUtil。beanToXml(student));}}未设置name属性DataNoArgsConstructorAllArgsConstructorAccessors(chaintrue)XmlRootElementpublicclassStudent{省略属性}
执行结果:lt;?xmlversion1。0encodingUTF8standaloneyes?student北京市长安街001号address25agename张三nameno1001nostudent设置name属性为STDENTDataNoArgsConstructorAllArgsConstructorAccessors(chaintrue)XmlRootElement(nameSTUDENT)publicclassStudent{省略属性}
执行结果:lt;?xmlversion1。0encodingUTF8standaloneyes?STUDENT北京市长安街001号address25agename张三nameno1001noSTUDENTXmlType
标注位置
类
是否必须
非必须
注解作用
主要使用其propOrder属性,用于对XML元素排序,如果设置了propOrder属性,那么属性的值要包括所有的待转换的字段DataNoArgsConstructorAllArgsConstructorAccessors(chaintrue)XmlRootElementXmlType(propOrder{no,age,name,address})publicclassStudent{省略属性}
测试代码:publicclassXmlBeanMapperTest{测试{linkXmlType}注解TestpublicvoidtestXmlType(){StudentstudentnewStudent(1001,张三,25,北京市长安街001号);Console。log(JAXBUtil。beanToXml(student));}}
执行结果:未添加XmlType注解前lt;?xmlversion1。0encodingUTF8standaloneyes?student北京市长安街001号address25agename张三nameno1001nostudent添加后,按照指定的顺序排序lt;?xmlversion1。0encodingUTF8standaloneyes?studentno1001no25agename张三name北京市长安街001号addressstudentXmlAccessorType
标注位置
类
是否必须
非必须
注解作用
用于控制JavaBean和XML转换字段和元素之间的映射,包括如下四种控制类型:PROPERTY:对JavaBean中有GetterSetter方法或使用XmlElement注解标注的属性进行映射FIELD:对JavaBean中非static、transient修饰的属性进行映射PUBLICMEMBER:默认值,对JavaBean中public修饰或有GetterSetter方法或使用XmlElement注解标注的属性进行映射NONE:仅对JavaBean中使用XmlElement注解标注的属性进行映射
注意:当使用Lombok中Data注解时,若使用PROPERTY或PUBLICMEMBER类型时会出现异常,如果继续使用Data那么就需要使用FIELD或NONE类型。
对上面公共的学生类做些修改,详见Student类中的注释:Data注释LombokData注解,不自动生成GetterSetter方法等ToStringNoArgsConstructorAllArgsConstructorAccessors(chaintrue)XmlRootElementXmlAccessorType根据下面测试的场景,设置对应的值publicclassStudent{学号:有GetterSetter方法(通过LombokGetterSetter注解,或手动编写GetterSetter方法)GetterSetterprivateStringno;学生姓名:将原private修饰改为public修饰,也就是通过类实例就可以访问该变量publicStringname;年龄:使用XmlElement注解,现在可以先了解该注解是用于类属性和XML标签映射,后面详解XmlElementprivateIntegerage;家庭地址:private修饰的变量没有GetterSetter方法privateStringaddress;}
测试类:publicclassXmlBeanMapperTest{privatestaticfinalStringXMLlt;?xmlversion1。0encodingUTF8standaloneyes?student北京市长安街001号address25agename张三nameno1001nostudent;测试{linkXmlAccessorType}注解TestpublicvoidtestXmlAccessorType(){StudentstudentnewStudent(1001,张三,25,北京市长安街001号);Console。log(JAXBUtil。beanToXml(student));Console。log(JAXBUtil。xmlToBean(XML,Student。class));}}PROPERTY
运行测试类,执行结果如下:lt;?xmlversion1。0encodingUTF8standaloneyes?student25ageno1001nostudentStudent(no1001,namenull,age25,addressnull)
可以看到当注解XmlAccessorTypevaluePROPERTY时,JavaBean和XML相互映射,只有有GetterSetter方法或标注XmlElement注解的属性生效。FIELD
运行测试类,执行结果如下:lt;?xmlversion1。0encodingUTF8standaloneyes?studentno1001noname张三name25age北京市长安街001号addressstudentStudent(no1001,name张三,age25,address北京市长安街001号)
可以看到当注解XmlAccessorTypevalueFIELD时,JavaBean和XML相互映射,学生类中的字段都生效PUBLICMEMBER
运行测试类,执行结果如下:lt;?xmlversion1。0encodingUTF8standaloneyes?studentname张三name25ageno1001nostudentStudent(no1001,name张三,age25,addressnull)
可以看到当注解XmlAccessorTypevaluePUBLICMEMBER时,JavaBean和XML相互映射,只有有GetterSetter方法或标注XmlElement注解或public修饰的属性生效。NONE
运行测试类,执行结果如下:lt;?xmlversion1。0encodingUTF8standaloneyes?student25agestudentStudent(nonull,namenull,age25,addressnull)
可以看到当注解XmlAccessorTypevalueNONE时,JavaBean和XML相互映射,只有有XmlElement注解属性生效。
由于内容较多,其他内容详见下一篇文章,如果文章对大家有所帮助,欢迎点赞、关注、评论。
泪目!国羽女单20日本名将夺冠将金牌献给教练,陈雨菲送上祝福北京时间10月16日,国际羽联印尼挑战赛正在进行。本站挑战赛,虽然级别不高,但是国羽教练组依旧非常重视,安排一大批选手报名参赛,最终女单,男单,混双三项晋级决赛,其中男单选手雷兰曦
日本旅行关西必打卡温泉地城崎温泉,私汤招月庭来到关西泡温泉,怎么能不去有着1000多年泡温泉历史的城崎温泉呢。坐JR到城崎温泉站,预订一家小镇上的温泉旅馆或者温泉酒店,就可以漫步在城崎温泉的小街上,感受关西温泉乡的幽静气氛啦
寻根究底德国为什么被原谅?日本为什么不能原谅?第二次世界大战已经结束77年了,人们似乎不再记恨当年的德国,可是,却说什么也不肯原谅日本。有人说,那是因为德国公开道歉了,而日本却死活不肯低头道歉。我想,日本不肯道歉不是偶然的,人
宣称植物干细胞被罚干细胞化妆品是伪概念文日化砖家近日,昆岸(上海)信息技术有限公司(以下简称昆岸)宣称其所售化妆品欧华妍海藻精粹呼吸泡泡面膜含有紫球藻干细胞,被处以罚款2。55万元。据行政处罚信息显示,昆岸广告宣称华妍
其实我我狂热当我听摇滚时我感觉到热血沸腾我沉寂当我在节日人潮中我感觉到无动于衷我激动当我听国歌时我感觉到心潮澎湃我冷漠当我听闻有人死去我感觉到麻木不仁我幸福当我与家人在一起时我感觉到天伦
夜雨丨夏梦洁我无法面对一片蔚蓝(组诗)我无法面对一片蔚蓝(组诗)夏梦洁我无法面对一片蔚蓝我无法面对一片蔚蓝无论是清晨,还是夜晚蔚蓝的白天一份阳光,一沓白云添一丝风一曲蝉鸣都容易让人把全部美好记起来白天的蔚蓝允许一个人走
苍天有轮回,它能饶过谁,好好做人吧人间有黑白之分,有白天,有黑夜,人心也有黑白之分,为人正的是白,为人暗的是黑,但人现在的嘴巴却能把黑的说成白的,把白的硬生生的说成黑的,这就是人心不古,有多少人撒谎说谎言的,别人明
送给你,亲爱的欢喜又欢喜,喜欢更喜欢。吉士为我友,好景为我观。美酒为我饮,美食为我餐。花自飘零水自流。一种相思,两处闲愁。人生恰如三月花,倾我一生一世念。来如飞花散似烟,醉里不知年华限。琵琶弦上
信仰和修行相辅相成没信仰的人内心往往会鄙视那些有信仰的人,反之亦然。被嘲笑又何妨?被辱骂又何妨?问出这个问题时,意识到这与约定俗成的世俗规则相悖。修行就是要看见这些相悖之处。只要看见,就会超越。或许
2022年最后90天,敢不敢挑战这10件小事?哈喽我是悠悠2022年的春天夏天,都已经过去了。现在,虽然处于秋天的时光里,但也感受到了冬天的寒意。恍然间,这一年又快过完了,在今年最后的90天里,你敢不敢挑战以下10件小事?1。
来自于小说剑来的语录1大道不该如此小,道侣不该如此少。2阮姑娘可以这么问,我却不可以作此想,所以不会有答案的。3在保安最绝望的时候,宁站出来保护了他,所以宁不是选择,而是必选项。4世间唯有痴情,不容他