Java JAXB框架提供了多个注解用于实现Java对象与XML数据之间的相互转换,@XmlAttribute是专门用来将Java类的字段映射为XML元素属性的注解,能够让生成的XML结构更符合常见的XML规范。

@XmlAttribute注解基础用法
使用@XmlAttribute注解时,只需要将该注解添加到Java类的字段或者对应的getter方法上,就可以指定该字段作为XML元素的属性存在。
下面是一个简单的实体类示例,展示基础的注解使用方式:
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
// 指定该类对应的XML根元素名称为user
@XmlRootElement(name = "user")
public class User {
private String id;
private String name;
// 将id字段映射为user元素的属性,属性名称为userId
@XmlAttribute(name = "userId")
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
// 不指定name参数时,属性名称默认和字段名称一致
@XmlAttribute
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
当我们将该User对象序列化为XML时,生成的XML结构如下:
<user userId="1001" name="张三"/>
@XmlAttribute常用参数说明
@XmlAttribute注解提供了多个可配置参数,用来满足不同的映射需求,常用的参数如下:
| 参数名 | 作用 | 默认值 |
|---|---|---|
| name | 指定XML属性的名称,如果不设置则默认使用字段的名称 | 字段名 |
| required | 指定该属性是否为必填项,为true时XML中必须包含该属性,否则反序列化会报错 | false |
| namespace | 指定XML属性所属的命名空间 | 空字符串 |
下面是使用required参数的示例:
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "product")
public class Product {
private String productId;
private double price;
// 指定productId为必填属性
@XmlAttribute(name = "productId", required = true)
public String getProductId() {
return productId;
}
public void setProductId(String productId) {
this.productId = productId;
}
@XmlAttribute
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
}
如果反序列化时XML的<product>元素没有productId属性,就会抛出异常。
完整序列化与反序列化示例
下面展示使用@XmlAttribute注解的实体类完成完整的XML序列化与反序列化流程:
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import java.io.StringReader;
import java.io.StringWriter;
public class JaxbDemo {
public static void main(String[] args) throws JAXBException {
// 序列化:Java对象转XML
User user = new User();
user.setId("1001");
user.setName("张三");
JAXBContext context = JAXBContext.newInstance(User.class);
Marshaller marshaller = context.createMarshaller();
// 设置格式化输出XML
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
StringWriter writer = new StringWriter();
marshaller.marshal(user, writer);
String xmlContent = writer.toString();
System.out.println("序列化结果:");
System.out.println(xmlContent);
// 反序列化:XML转Java对象
String xmlInput = "<user userId="1001" name="张三"></user>";
Unmarshaller unmarshaller = context.createUnmarshaller();
User deserializedUser = (User) unmarshaller.unmarshal(new StringReader(xmlInput));
System.out.println("反序列化结果:");
System.out.println("userId:" + deserializedUser.getId());
System.out.println("name:" + deserializedUser.getName());
}
}
运行上述代码后,会先输出格式化后的XML内容,再输出反序列化得到的User对象的字段值,验证了@XmlAttribute注解的映射效果。
使用注意事项
- @XmlAttribute注解可以添加在字段上,也可以添加在getter方法上,但是同一个字段不要同时在两个位置添加,否则会抛出异常。
- 如果字段类型是基本数据类型或者常见的包装类型、String类型,JAXB会自动完成类型转换,如果是自定义类型,需要额外配置适配器。
- 当XML属性名称和Java字段名称一致时,可以省略name参数,减少代码冗余。
JAXB@XmlAttributeJava_xml对象_xml映射修改时间:2026-06-20 20:39:30