我使用以下库将 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
注释。类层次结构被打包为一个库,并在多个应用程序之间共享。
使用
jaxb-runtime
2.3.1 运行时,JAXB 类 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);
但是当使用
jaxb-runtime
4.0.2 运行时,JAXB 类 ClassInfoImpl
会读取新的 jakarta.xml.bind.annotation.XmlType
(请注意 jakarta
前缀而不是 javax
前缀)。
当然找不到
XmlType
注解(因为不是同一个包),所以出现错误。
除了通过从
javax
更改为 jakarta
注释来更新我的库中的类之外,还有其他解决方案吗?
JAXB 4 是 JakartaEE 10 的一部分,而 JAXB 2.3 是 JavaEE 8 的一部分
主要变化是从 JakartaEE 9 开始,软件包从
javax.*
更改为 jakarta.*
(有关 Java 生态系统这一巨大变化的详细信息,请参阅 here)。
现在由 JakartaEE 负责的 Eclipse 基金会创建了这个工具(Eclipse Transformer),用于帮助用户进行这种迁移,因为用户想要进入 JakartaEE 世界很难更改代码库。
如果你无法更改你的java源(基于
javax
包),并且这个源被捆绑在你的应用程序使用的特定jar中(这应该是这种情况,因为jaxb4是jdk11基线并且你没有抱怨关于未定义javax.xml.bind.annotation.XmlType
的编译错误,因为从JDK9开始,JDK不再包含jaxb-runtime
),您可能有兴趣使用eclipse maven转换器插件。
希望这能帮助您按预期工作。