JavaBean和XML相互转换(一)
下一篇文章:JavaBean 和 XML 相互转换(二)
在我们对接第三方系统时,经常会遇到第三方系统的报文采用 XML 格式,这是就需要将 JavaBean 和 XML 相互转换。转换工具
在本示例中 JavaBean 和 XML 相互转换的工具采用 Hutool 提供的 JAXBUtil,所以在使用需要引入 Hutool 依赖,如下示例: cn.hutool hutool-all 5.8.10
JAXBUtil 工具其实是对 javax.xml.bind.JAXBContext 进行了包装
下面通过一些简单示例,介绍 JavaBean 和 XML 相互转换常用到的一些注解,在正式开始介绍之前,先定义一些用于转换的 JavaBean,如下所示:学校类:其包括基本类型字段和集合字段/** * 学校 */ @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; }@XmlRootElement
标注位置
类
是否必须
必须
注解作用
默认是将当前简单类名作为 XML 的 root 标签,如果设置该注解 name 属性,那么 name 属性值作为 root 标签
测试代码:只需关注只需结果 root 标签差异 public class XmlBeanMapperTest { /** * 测试 {@link XmlRootElement} 注解 */ @Test public void testXmlRootElement() { Student student = new Student("1001", "张三", 25, "北京市长安街 001 号"); Console.log(JAXBUtil.beanToXml(student)); } }未设置 name 属性@Data @NoArgsConstructor @AllArgsConstructor @Accessors(chain = true) @XmlRootElement public class Student { // 省略属性 }
执行结果:<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 北京市长安街 001 号 25 张三 1001 设置 name 属性为 STDENT@Data @NoArgsConstructor @AllArgsConstructor @Accessors(chain = true) @XmlRootElement(name = "STUDENT") public class Student { // 省略属性 }
执行结果:<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 北京市长安街 001 号 25 张三 1001 @XmlType
标注位置
类
是否必须
非必须
注解作用
主要使用其 propOrder 属性,用于对 XML 元素排序,如果设置了 propOrder 属性,那么属性的值要包括所有的待转换的字段@Data @NoArgsConstructor @AllArgsConstructor @Accessors(chain = true) @XmlRootElement @XmlType(propOrder = {"no", "age", "name", "address"}) public class Student { // 省略属性 }
测试代码:public class XmlBeanMapperTest { /** * 测试 {@link XmlType} 注解 */ @Test public void testXmlType() { Student student = new Student("1001", "张三", 25, "北京市长安街 001 号"); Console.log(JAXBUtil.beanToXml(student)); } }
执行结果:// 未添加 @XmlType 注解前 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> 北京市长安街 001 号 25 张三 1001 // 添加后,按照指定的顺序排序 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> 1001 25 张三 北京市长安街 001 号 @XmlAccessorType
标注位置
类
是否必须
非必须
注解作用
用于控制 JavaBean 和 XML 转换字段和元素之间的映射,包括如下四种控制类型:PROPERTY:对 JavaBean 中有 Getter/Setter 方法或使用 @XmlElement 注解标注的属性进行映射FIELD:对 JavaBean 中非 static、transient 修饰的属性进行映射PUBLIC_MEMBER:默认值,对 JavaBean 中 public 修饰或有 Getter/Setter 方法或使用 @XmlElement 注解标注的属性进行映射NONE:仅对 JavaBean 中使用 @XmlElement 注解标注的属性进行映射
注意:当使用 Lombok 中 @Data 注解时,若使用 PROPERTY 或 PUBLIC_MEMBER 类型时会出现异常,如果继续使用 @Data 那么就需要使用 FIELD 或 NONE 类型。
对上面公共的学生类做些修改,详见 Student 类中的注释://@Data 注释 Lombok @Data 注解,不自动生成 Getter/Setter 方法等 @ToString @NoArgsConstructor @AllArgsConstructor @Accessors(chain = true) @XmlRootElement @XmlAccessorType // 根据下面测试的场景,设置对应的值 public class Student { /** * 学号:有 Getter/Setter 方法(通过 Lombok @Getter/@Setter 注解, * 或手动编写 Getter/Setter 方法) */ @Getter @Setter private String no; /** * 学生姓名:将原 private 修饰改为 public 修饰,也就是通过类实例就可以访问该变量 */ public String name; /** * 年龄:使用 @XmlElement 注解,现在可以先了解该注解是用于类属性和 XML 标签映射, * 后面详解 */ @XmlElement private Integer age; /** * 家庭地址:private 修饰的变量没有 Getter/Setter 方法 */ private String address; }
测试类:public class XmlBeanMapperTest { private static final String XML = "<?xml version="1.0" encoding="UTF-8" standalone="yes"?> " + " " + " 北京市长安街 001 号 " + " 25 " + " 张三 " + " 1001 " + ""; /** * 测试 {@link XmlAccessorType} 注解 */ @Test public void testXmlAccessorType() { Student student = new Student("1001", "张三", 25, "北京市长安街 001 号"); Console.log(JAXBUtil.beanToXml(student)); Console.log(JAXBUtil.xmlToBean(XML, Student.class)); } }PROPERTY
运行测试类,执行结果如下:<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 25 1001 Student(no=1001, name=null, age=25, address=null)
可以看到当注解 @XmlAccessorType value=PROPERTY 时, JavaBean 和 XML 相互映射,只有有 Getter/Setter 方法或标注 @XmlElement 注解的属性生效。FIELD
运行测试类,执行结果如下:<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 1001 张三 25 北京市长安街 001 号 Student(no=1001, name=张三, age=25, address=北京市长安街 001 号)
可以看到当注解 @XmlAccessorType value=FIELD 时, JavaBean 和 XML 相互映射,学生类中的字段都生效PUBLIC_MEMBER
运行测试类,执行结果如下:<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 张三 25 1001 Student(no=1001, name=张三, age=25, address=null)
可以看到当注解 @XmlAccessorType value=PUBLIC_MEMBER 时, JavaBean 和 XML 相互映射,只有有 Getter/Setter 方法或标注 @XmlElement 注解或 public 修饰的属性生效。NONE
运行测试类,执行结果如下:<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 25 Student(no=null, name=null, age=25, address=null)
可以看到当注解 @XmlAccessorType value=NONE 时, JavaBean 和 XML 相互映射,只有有 @XmlElement 注解属性生效。
由于内容较多,其他内容详见下一篇文章,如果文章对大家有所帮助,欢迎点赞、关注、评论。
山中散文集锦三十二这是我发在西瓜视频和抖音上的视频诗心孤旅之山水诗词,如有不当,即可删除。想去看雨不知道你懂不懂得大山的襟怀!不知道你了解不了解自己的心胸!更不知道你的心胸里有没有自己的天空!自己的
中年人的自救,从拒绝内耗开始文乐澄图来源网络,与文无关,侵删知乎上有人问究竟什么是内耗?有这样一个高赞的回答内耗,就是一个人在给自己发起战争,不用别人动手,就能把自己消耗殆尽。人生就像一场考试,要想得到一份满
任溶溶100岁,他的人生是100分,满分任老任溶溶走了,是好友建江在微信里告诉我的,那天是2022年9月22日。其实,任老他去了他要去的地方,那是一个秘密,只有他自己才会知道。任老没有告诉我们,就在凌晨他自己选择的最安静
残影空间投资带你科普电影业在时代轮回中骗过多少我们不知道的回看过去的经济史,发现时代真的是一个大轮回。这两年受疫情的影响,各个行业都受到了冲击,实体经济低迷,企业裁员股市暴跌货币贬值等等情况,与1929年美国经济大萧条似曾相识。虽然当时人
上映首日全国仅两名观众,那些无人问津的电影长啥样?(ICphoto图)前几天,票房数据显示一部名叫林深时见麓的电影,首日票房仅75元,全国只有两个观众。有网友留言表示票房75元,我一个人贡献了70块!!另一位是用了什么优惠券!?气
呢大衣彻底失恋了!今年泰迪熊外套火了,竟比皮草还洋气时髦呢面已经霸榜冬季面料好多年,呢面料的质感和厚度以及保暖型都独具一格,但是这几年秋冬毛绒面料也成了后起之秀。现在流行的是短毛的摇粒绒面料,并不是以前流行的皮草,摇粒绒的单品给人的感觉
凯特王妃KateMiddleton优雅Pantone2023年年度色剑桥公爵夫人凯特王妃KateMiddleton衣着品味备受大家肯定,每次出席公开场合,都展现出高贵优雅的气质,更是公认的穿搭高手,亦不介意旧衣新穿,从高级品AlexanderMcQ
黄渤处女电影上车,走吧,致漂泊异乡努力奋斗的你我黄渤处女电影上车,走吧,致漂泊异乡努力奋斗的你我他乡容不下我的灵魂,故乡容不下我的肉身。选择北上广深,还是逃离北上广深,这是我们这一代人永恒的话题。一方面是物质与财富的追求,一方面
老公阳第四天,我还阴,我发现这3个原因很少人提起的事跟老公同床共枕第四天,我还没阳,宝宝也没阳,家里还有我妈妈也阳了,平时我就大病没有小病不断,还以为免疫力差到我会最先阳,作为天选做饭人着实觉得自己很幸运。哦,宝宝才2岁还不会做三菜
对孩子大吼大叫能解决问题吗?我们经常在公众场合遇到一些父母情绪失控教育孩子的场景,孩子一边在哭,爸妈一边在吼叫的画面。对孩子大吼今天就给大家分享一个主题,教育孩子父母非得大吼大叫吗?很多父母说我也知道大吼大叫
二胎孕妇突然阵痛!好在路过的她多看了一眼扬州的徐女士(化名)是一名二胎产妇。12月16日,突然腹部阵痛的她前往当地一家医院。刚到医院,她就被职业敏感性超强的助产士拉到了产房,十几分钟之后孩子便诞生了。徐女士自己回想起来都