提问人:Julien Kronegg 提问时间:10/25/2023 更新时间:11/20/2023 访问量:67
Javax 到雅加达的迁移:GlassFish JAXB 4.x 读取 Jakarta.xml.bind.annotations*,但不读取 javax.xml.bind.annotations.*
javax to jakarta migration: glassfish JAXB 4.x reads jakarta.xml.bind.annotations* but not javax.xml.bind.annotations.*
问:
背景
我正在使用以下库将 XML 解组到 Java:
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.1</version>
</dependency>
解组代码如下所示:
MyClass instance = JAXBContext.newInstance(MyClass.class)
.createUnmarshaller()
.unmarshal(new StreamSource(getClass().getClassLoader()
.getResourceAsStream("myfile.xml")), MyClass.class)
.getValue();
它运作良好。
问题
我正在尝试迁移到库的 4.0.2 版:
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>4.0.2</version>
</dependency>
运行代码时,发生错误:
Two classes have the same XML type name "someType". Use @XmlType.name and @XmlType.namespace to assign different names to them.
分析
在我的类层次结构中有两个类“SomeType”(在不同的命名空间中)。这两个类由 进行批注。类层次结构打包为库,并在多个应用程序之间共享。javax.xml.bind.annotation.XmlType
使用 2.3.1 运行时,JAXB 类会读取注释:jaxb-runtime
ClassInfoImpl
javax.xml.bind.annotation.XmlType
this.elementName = this.parseElementName(clazz);
XmlType t = (XmlType)this.reader().getClassAnnotation(XmlType.class, clazz, this);
this.typeName = this.parseTypeName(clazz, t);
但是,当使用 4.0.2 运行时,JAXB 类会读取 new(注意前缀而不是前缀)。jaxb-runtime
ClassInfoImpl
jakarta.xml.bind.annotation.XmlType
jakarta
javax
当然,找不到注解(因为它不是同一个包),所以会发生错误。XmlType
问题
除了通过更改 from to 注释来更新我的库中的类之外,还有其他解决方案吗?javax
jakarta
答:
JAXB 4 是 JakartaEE 10 的一部分,而 JAXB 2.3 是 JavaEE 8 的一部分
主要的变化是从 JakartaEE 9 开始的软件包变化(有关 Java 生态系统中这一巨大变化的详细信息,请参见此处)。javax.*
jakarta.*
现在由JakartaEE负责的eclipse基金会创建了这个工具(eclipse transformer),以帮助用户进行这种迁移,因为很难改变用户想要使用JakartaEE世界的代码库。
如果您无法更改 java 源代码(基于包),并且该源代码捆绑在应用程序使用的特定 jar 中(应该是这种情况,因为 jaxb4 是 jdk11 基线,并且您没有抱怨 undefined 的编译错误,因为从 JDK9 开始不再包含在 JDK 中),您可能有兴趣使用 eclipse maven transformer 插件。javax
javax.xml.bind.annotation.XmlType
jaxb-runtime
希望这能帮助您按预期工作。
评论
javax
jakarta