从 jaxb xjc 代迁移到 jakarta 和 Java 17

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

我们正在调查我们的应用程序从 JDK8 到 JDK17 的迁移。我们的一些模块使用基于 wsdl 的 Web 服务,其他一些使用 .xsd 模式等。无论如何,我们使用 JAXWS 和 JAXB api,它们自版本 11 以来已从 JDK 中删除并移至 Jakarta。

我已经成功地开始使用 jakarta 依赖项从 .wsdl 和 .xsd 文件生成源代码,并且源代码是使用 jakarta imports 正确生成的

import jakarta.xml.bind.JAXBElement;
import jakarta.xml.bind.annotation.XmlAccessType;
import jakarta.xml.bind.annotation.XmlAccessorType;
import jakarta.xml.bind.annotation.XmlElementRef;

而之前它使用的是

javax.xml.bind.
东西,这些东西在编译时不再可用。我的问题是,虽然我已经成功生成了基于模式的源代码,但新的生成器会生成不同的代码(类名、访问器等),我想在进行重构之前确认这是预期的行为。

例子:

我们的 .xsd 包含以下内容:

<xsd:complexType name="ForkStepType">
    <xsd:annotation>
        <xsd:appinfo>
            <jxb:class name="ForkStep"/>
        </xsd:appinfo>
    </xsd:annotation>
    <xsd:complexContent>
        <xsd:extension base="tns:LinearStepType">
            <xsd:sequence/>
            <xsd:attribute name="forkLevel" type="tns:ForkLevelType" use="required"/>
        </xsd:extension>
    </xsd:complexContent>
</xsd:complexType>

The old xjc generator using jaxb version

2.2.11
would generate a class named
ForkStep
, I'm guessing based on the
jxb:class
element.另一方面,雅加达
3.0.1
生成器生成一个名为
ForkStepType
的类,我猜它来自
xsd:complexType
元素。

这是预期的行为吗?在解释规范时,旧的实现是否不正确,或者是否有我应该注意的标志/规范目标版本,以便正确重现我们应用程序的现有行为?

java jakarta-ee xsd java-17 java-platform-module-system
2个回答
8
投票

问题来自于忘记将 jaxb schema 升级到 jakarta uri 和 3.0 版本。

具体

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
    jxb:version="1.0"

必须改为

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:jxb="https://jakarta.ee/xml/ns/jaxb"
    jxb:version="3.0"

供参考,也必须对.wsdl文件进行类似的更改,例如

xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"
xmlns:jaxws="https://jakarta.ee/xml/ns/jaxws"


0
投票

我正在将我的项目从 Java 8 升级到 Java 17,我的项目使用 JAXB。我不确定 Java 17 将使用哪些与 JAXB 相关的 JAR 文件和版本。你能帮我看看你用来成功运行项目的 JAR 文件吗?谢谢!

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