当前位置: 首页 > news >正文

@XmlAccessorType+@XmlElement完美解决Java类到XML映射问题

前言:

最近项目在做静态代码扫描的时候,出现Java类中成员变量命名的问题,开头字母必须小写,但是这个类成员是对接其他公司的字段,对方提供的请求格式是XML,必须将Java类转化为XML的格式,而且这个类成员变量开头还必须大写,网上查阅了大量资料,总结出了使用这个三个变量可以完美解决问题。

这里笔者就不使用@Data注解了,方便食用!!!

目的:

1 将Java类成功映射成XML

2 类中某个成员变量开头大写

准备:

@XmlAccessorType 和 @XmlElement 是 Java Architecture for XML Binding (JAXB) 规范中的注解,用于控制 Java 对象与 XML 表示之间的映射关系。

@XmlAccessorType(XmlAccessType.FIELD):

工作原理: 该注解用于指定 JAXB 在映射 Java 类与 XML 之间的时候,应该访问哪一种属性。XmlAccessType.FIELD 表示 JAXB 应该直接访问类的字段(fields),而不是通过 getter 和 setter 方法。
作用: 控制 JAXB 如何访问类的属性。

@XmlElement:

工作原理: 该注解用于映射 Java 类的字段或属性到 XML 元素。它可以用在字段或 getter 方法上。
作用: 定义 Java 对象如何转换为 XML 元素以及反向转换。

三种不同场景示例:

场景一:仅使用 @XmlElement 注解,这里注意一般是写在get方法上面

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;@XmlRootElement
public class Person {private String name;private int age;@XmlElementpublic String getName() {return name;}public void setName(String name) {this.name = name;}@XmlElementpublic int getAge() {return age;}public void setAge(int age) {this.age = age;}
}

结果:

<person><name>John Doe</name><age>30</age>
</person>

场景二:仅使用 @XmlAccessorType(XmlAccessType.FIELD) 注解

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Person {private String name;private int age;// No need for @XmlElement herepublic String getName() {return name;}public void setName(String name) {this.name = name;}// No need for @XmlElement herepublic int getAge() {return age;}public void setAge(int age) {this.age = age;}
}

结果:

<person><name>John Doe</name><age>30</age>
</person>

场景三:共同使用 @XmlAccessorType(XmlAccessType.FIELD) 和 @XmlElement 注解

这里已经很明显了,在使用@XmlAccessorType(XmlAccessType.FIELD)基础上,可以修改成员变量映射XML后的名称

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Person {// No need for @XmlElement hereprivate String name;// No need for @XmlElement hereprivate int age;// @XmlElement is required here@XmlElement(name = "Acity")private String address;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}
}

结果:

<person><name>John Doe</name><age>30</age><Acity>New York</Acity>
</person>

总结:

第三种场景就可以满足本次需求!!!

在上述示例中,第一个场景使用了 @XmlElement 注解,第二个场景使用了 @XmlAccessorType(XmlAccessType.FIELD) 注解,而第三个场景同时使用了两者。在场景三中,对于 address 字段,使用了 @XmlElement(name = "Acity") 来指定 XML 元素的名称。这些注解的组合方式可以根据需求来灵活使用,以达到对 XML 与 Java 对象的映射要求。

http://www.lryc.cn/news/265228.html

相关文章:

  • 软件渗透测试有哪些测试流程?权威安全测试报告的重要性
  • 安防视频融合云平台/智慧监控平台EasyCVR如何添加验证码调用接口?
  • 浏览器输入一个url,它的解析过程
  • 第29节: Vue3 列表渲染
  • CloudPulse:一款针对AWS云环境的SSL证书搜索与分析引擎
  • 【网络安全】学习Web安全必须知道的一本书
  • 千帆 AppBuilder 初体验,不仅解决解决了我筛选简历的痛苦,更是让提效10倍!
  • Ubuntu 常用命令之 cal 命令用法介绍
  • 项目中webpack优化配置(1)
  • 【Qt之Quick模块】5. QML基本类型及示例用法
  • MySQL运维实战(1.2)安装部署:使用二进制安装部署
  • ChatGPT一周年:开源语言大模型的冲击
  • C++ Qt开发:Charts绘图组件概述
  • 基于Java+SpringBoot实现人脸识别搜索
  • 【论文阅读】FreeU: Free Lunch in Diffusion U-Net
  • TypeScript实战——ChatGPT前端自适应手机端,PC端
  • 自定义ORM(mybatis)源码(六)-类型处理器
  • Linux shell编程学习笔记37:readarray命令和mapfile命令
  • GDB:强大的GNU调试器
  • 综述 2022-Egyptian Informatics Journal:电子健康记录的安全和隐私
  • PHP数组定义和输出
  • MySQL中已经有了Binlog,为啥还要有Redo Log
  • Java数据结构-模拟ArrayList集合思想,手写底层源码(1),底层数据结构是数组,编写add添加方法,正序打印和倒叙打印
  • MyBatis-Plus如何 关闭SQL日志打印
  • 单元测试框架jUnit
  • 微软 Visual Studio 迎来 AI 建议命名功能
  • 【排序算法】C语言实现选择排序与冒泡排序
  • 设计模式之-原型模式,快速掌握原型模式,通俗易懂的理解原型模式以及使用场景
  • 数据结构之进阶二叉树(二叉搜索树和AVL树、红黑树的实现)超详细解析,附实操图和搜索二叉树的实现过程图
  • SpringIOC之LocaleContext