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
相关产品推荐
相关产品推荐

