Java JAXB(Java Architecture for XML Binding)是Java EE平台中用于实现Java对象和XML文档相互转换的标准技术,通过注解配置即可完成映射关系的定义,无需手动编写XML解析和生成的冗余代码。

JAXB核心注解说明
JAXB通过一系列注解来定义Java类和XML元素的映射关系,常用的注解如下:
- @XmlRootElement:标注在类上,指定该类对应XML的根元素,root参数设置根元素名称。
- @XmlElement:标注在类的字段或getter方法上,指定字段对应XML的子元素,name参数设置元素名称。
- @XmlAttribute:标注在字段或getter方法上,指定字段对应XML元素的属性。
- @XmlTransient:标注在字段或getter方法上,表示该字段不参与XML映射。
准备映射实体类
首先定义一个用户实体类,使用JAXB注解标注映射关系:
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "user")
public class User {
private Integer id;
private String name;
private Integer age;
@XmlAttribute(name = "id")
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@XmlElement(name = "username")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@XmlElement(name = "user_age")
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
对象转XML实现
使用JAXBContext和Marshaller类可以将Java对象转换为XML字符串,具体实现代码如下:
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import java.io.StringWriter;
public class ObjectToXmlDemo {
public static void main(String[] args) {
try {
// 创建用户对象并设置属性
User user = new User();
user.setId(1);
user.setName("张三");
user.setAge(25);
// 获取JAXBContext实例,传入实体类
JAXBContext context = JAXBContext.newInstance(User.class);
// 创建Marshaller对象用于对象转XML
Marshaller marshaller = context.createMarshaller();
// 设置格式化输出,让XML更易读
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
// 输出到字符串
StringWriter writer = new StringWriter();
marshaller.marshal(user, writer);
String xmlResult = writer.toString();
System.out.println("对象转XML结果:");
System.out.println(xmlResult);
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行上述代码后,输出的XML内容如下:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<user id="1">
<username>张三</username>
<user_age>25</user_age>
</user>
XML转对象实现
使用Unmarshaller类可以将XML内容转换为对应的Java对象,实现代码如下:
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import java.io.StringReader;
public class XmlToObjectDemo {
public static void main(String[] args) {
try {
// 待转换的XML字符串
String xmlContent = "<?xml version="1.0" encoding="UTF-8" standalone="yes"?>n" +
"<user id="2">n" +
" <username>李四</username>n" +
" <user_age>30</user_age>n" +
"</user>";
// 获取JAXBContext实例
JAXBContext context = JAXBContext.newInstance(User.class);
// 创建Unmarshaller对象用于XML转对象
Unmarshaller unmarshaller = context.createUnmarshaller();
// 将XML字符串转换为对象
StringReader reader = new StringReader(xmlContent);
User user = (User) unmarshaller.unmarshal(reader);
// 输出对象属性
System.out.println("XML转对象结果:");
System.out.println("用户ID:" + user.getId());
System.out.println("用户名称:" + user.getName());
System.out.println("用户年龄:" + user.getAge());
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用注意事项
在使用JAXB时需要注意以下几点:
- 实体类必须有无参构造方法,JAXB反射创建对象时需要用到。
- 如果要映射的字段是私有属性,需要为其提供getter和setter方法,否则JAXB无法访问字段值。
- JAXB在Java 9及之后的版本中已经从默认模块中移除,如果需要使用需要手动添加相关依赖。
- 如果XML中有命名空间,需要通过@XmlSchema注解在包级别配置命名空间信息。