Java 17中如何为Record类配置XML序列化注解(@XmlElement等)
Java 17 Record类自定义XML序列化属性(@XmlElement、@XmlRootElement)
在Java 17中使用Record类进行XML序列化时,你可以直接在Record类本身和其组件上标注JAXB注解(如@XmlRootElement、@XmlElement),JAXB能够识别Record自动生成的组件访问器方法(如name()、age()),无需额外编写getter/setter。
基础自定义示例
给Record类添加根元素注解,同时为组件指定自定义XML元素名称:
import jakarta.xml.bind.annotation.XmlElement; import jakarta.xml.bind.annotation.XmlRootElement; // 指定XML根元素名称为"person"(默认是类名Person) @XmlRootElement(name = "person") public record Person( // 将name字段映射为XML元素"full_name" @XmlElement(name = "full_name") String name, // 将age字段映射为XML元素"years_old" @XmlElement(name = "years_old") int age ) {}
进阶自定义(命名空间、元素顺序、必填约束)
如果需要处理命名空间、指定XML元素输出顺序或标记必填字段,可以结合@XmlType和@XmlElement的额外属性:
import jakarta.xml.bind.annotation.XmlElement; import jakarta.xml.bind.annotation.XmlRootElement; import jakarta.xml.bind.annotation.XmlType; @XmlRootElement(namespace = "http://example.com/persons") // 指定XML元素的输出顺序为age在前,name在后 @XmlType(propOrder = {"age", "name"}) public record Person( // 指定字段命名空间,同时标记为必填 @XmlElement(namespace = "http://example.com/persons", required = true) String name, @XmlElement(namespace = "http://example.com/persons") int age ) {}
测试序列化代码
用JAXB将Record实例序列化为XML:
import jakarta.xml.bind.JAXBContext; import jakarta.xml.bind.JAXBException; import jakarta.xml.bind.Marshaller; import java.io.StringWriter; public class RecordXmlDemo { public static void main(String[] args) throws JAXBException { Person person = new Person("Alice", 30); JAXBContext context = JAXBContext.newInstance(Person.class); Marshaller marshaller = context.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); StringWriter writer = new StringWriter(); marshaller.marshal(person, writer); System.out.println(writer.toString()); } }
输出的格式化XML如下:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <person xmlns="http://example.com/persons"> <age>30</age> <name>Alice</name> </person>
注意事项
- 推荐使用Jakarta XML Binding(
jakarta.xml.bind包),Java EE原有的javax.xml.bind包已被弃用,Java 17及后续版本优先使用Jakarta规范的实现。 - 若要忽略某个Record组件,可在该组件上标注
@XmlTransient,对应字段将不会被序列化到XML中。 - Record的组件默认是public的,JAXB会自动识别对应的访问器方法,无需手动编写getter方法。
内容的提问来源于stack exchange,提问作者sriam980980
相关产品推荐
相关产品推荐

