You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 10:10:17