java - 从 jaxb xjc 生成迁移到 jakarta 和 Java 17
问题描述
我们正在调查我们的应用程序从 JDK8 到 JDK17 的迁移。我们的一些模块使用基于 wsdl 的 Web 服务,而另一些则使用 .xsd 模式等。无论如何,我们使用 JAXWS 和 JAXB api,它们现在从 JDK 版本 11 中删除并移至 Jakarta。
我已经成功地开始使用 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
元素。3.0.1
另一方面,jakarta生成器生成一个名为的类ForkStepType
,我猜它来自xsd:complexType
元素。
这是预期的行为吗?在解释规范时,旧的实现是否不正确,或者是否有我应该注意的标志/规范目标版本,以便正确重现我们应用程序的现有行为?
解决方案
问题来自忘记将 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"
推荐阅读
- javascript - 从文件中导出类时,未为实例定义类方法
- angular - ngx-clipboard 没有 Token DOCUMENT 的提供者
- yaml - 大摇大摆地定义常量值
- c++ - 传递给函数的临时对象的生命周期
- javascript - 通过电子邮件发送时返回空日期字段(Google 电子表格)
- google-apps-script - 是否可以使用我通过网络发布表编写的脚本功能?
- jenkins - 获取其他工作的构建 git commit
- javascript - 当浏览器空闲且页面中有动态 iframe 时,JavaScript 检测浏览器不活动期
- objective-c - NSTextField 的 -allowsExpansionToolTips 在以编程方式更改约束后不起作用
- shell - 以交互方式从 JAVA 运行 Spark-Shell