javax 到 jakarta 迁移:glassfish JAXB 4.x 读取 jakarta.xml.bind.annotations*,但不读取 javax.xml.bind.annotations。*

问题描述 投票:0回答:1

背景

我使用以下库将 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
注释来更新我的库中的类之外,还有其他解决方案吗?

java xml jaxb jakarta-migration
1个回答
0
投票

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转换器插件

希望这能帮助您按预期工作。

© www.soinside.com 2019 - 2024. All rights reserved.