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

JAXB在JDK21与Spring Boot 3.x中的使用疑问

JDK21 + Spring Boot 3.1.8下JAXB的使用与替代方案

能否继续使用javax.jaxb?

不行。原因有两点:

  • JDK 9开始将JAXB从核心模块中移除,JDK 21已经完全不包含javax.xml.bind相关包,手动引入该包的依赖会导致类加载冲突。
  • Spring Boot 3.x基于Jakarta EE规范构建,整个生态已经从javax迁移到jakarta命名空间,javax.jaxb的API与Spring Boot 3.x的依赖体系不兼容,强行使用会出现大量编译或运行时错误。

替代的marshal(编组)与unmarshal(解组)方案

1. 官方替代:Jakarta XML Binding(Jakarta JAXB)

这是原JAXB的官方升级版本,完全适配Jakarta EE生态,也是Spring Boot 3.x推荐的方案。

依赖配置(Maven)

<dependency>
    <groupId>jakarta.xml.bind</groupId>
    <artifactId>jakarta.xml.bind-api</artifactId>
</dependency>
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <scope>runtime</scope>
</dependency>

示例代码

import jakarta.xml.bind.JAXBContext;
import jakarta.xml.bind.JAXBException;
import jakarta.xml.bind.Marshaller;
import jakarta.xml.bind.Unmarshaller;
import jakarta.xml.bind.annotation.XmlRootElement;
import java.io.StringReader;
import java.io.StringWriter;

@XmlRootElement
class User {
    private String name;
    private int age;

    // 必须有无参构造器
    public User() {}

    // getter和setter
    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; }
}

// 编组(对象转XML)
public String marshalUser(User user) throws JAXBException {
    JAXBContext context = JAXBContext.newInstance(User.class);
    Marshaller marshaller = context.createMarshaller();
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

    StringWriter writer = new StringWriter();
    marshaller.marshal(user, writer);
    return writer.toString();
}

// 解组(XML转对象)
public User unmarshalUser(String xml) throws JAXBException {
    JAXBContext context = JAXBContext.newInstance(User.class);
    Unmarshaller unmarshaller = context.createUnmarshaller();
    return (User) unmarshaller.unmarshal(new StringReader(xml));
}

2. Jackson XML模块

Spring Boot默认集成Jackson,通过其XML模块可以快速实现对象与XML的转换,无需额外学习JAXB的注解体系(当然也支持自定义注解)。

依赖配置(Maven)

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
</dependency>

示例代码

import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import java.io.IOException;

class User {
    private String name;
    private int age;

    // getter和setter
    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; }
}

// 编组(对象转XML)
public String marshalUser(User user) throws IOException {
    XmlMapper xmlMapper = new XmlMapper();
    return xmlMapper.writeValueAsString(user);
}

// 解组(XML转对象)
public User unmarshalUser(String xml) throws IOException {
    XmlMapper xmlMapper = new XmlMapper();
    return xmlMapper.readValue(xml, User.class);
}

3. 其他可选方案

如果上述两种方案不满足需求,还可以考虑:

  • Apache Commons XMLBean:基于XML Schema生成Java类,适合复杂XML结构的场景。
  • JDOM2 + XStream:手动构建XML树或使用XStream实现对象与XML的转换,灵活性更高但代码量较大。

内容的提问来源于stack exchange,提问作者Vijay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 11:06:12