java 17+ 的 record 与 jaxb 根本不兼容,因 record 无无参构造器、不可变、无 setter,且 jaxb ri 自 java 14+ 明确拒绝 record 类型;推荐采用双层建模(jaxb class + record 转换)或改用 jackson xml(2.12+ 支持 record)。
Java 17+ 的 record 无法直接被 JAXB(javax.xml.bind)处理,因为 JAXB 要求类具备无参构造器、可变字段、getter/setter 方法,而 record 天然不可变、无无参构造器、字段私有且无 setter —— 这不是配置问题,是根本性不兼容。
为什么 JAXB 会抛 IllegalArgumentException: Class is an interface or a record
JAXB RI(如 Metro)在 Java 14+ 明确拒绝处理 record 类型,底层反射检查到 Class.isRecord() 返回 true 就直接失败。即使你用 @XmlRootElement 或 @XmlAccessorType(XmlAccessType.FIELD) 修饰,也绕不过这个校验。
- JAXB 实现(如
com.sun.xml.bind.v2.runtime.JAXBContextImpl)在构建元模型时强制排除record - Java 17 移除了
java.xml.bind模块,JAXB 已是第三方库,其最新维护版本(2.3.9+)仍未支持record - 哪怕降级到 Java 11 + JAXB 2.3.3,
record仍因缺少无参构造器导致UnmarshalException
替代方案:用普通 class + record 双层建模
保持 API 层用 record 提供不可变语义,XML 解析层用传统 class 承接 JAXB,再手动或通过工具转换。这是目前最稳定、零运行时风险的做法。