提问者:小点点

从jaxb xjc一代迁移到雅加达和Java17


我们正在研究将我们的应用程序从JDK8迁移到JDK17的过程。我们的一些模块使用基于wsdl的Web服务,一些模块使用. xsd模式等。无论如何,我们使用JAXWS和JAXB API,这些API从版本11开始就从JDK中删除,并迁移到雅加达。

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

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>

使用jaxb版本2.2.11的旧xjc生成器会生成一个名为ForkStep的类,我猜是基于jxb: class元素。另一方面,jakarta3.0.1生成器生成了一个名为ForkStepType的类,我猜它来自xsd:ComplType元素。

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


共1个答案

匿名用户

问题来自忘记将jaxb模式升级到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"