我正在使用 maven-hyperjaxb3-plugin (0.6.1) 从我的 xsd 文件生成域类。除了一个类之外,一切都运行良好,甚至在我添加超过 23 个字段之前都运行良好。
一旦超过该字段数,它就会为我的名为 ILT 的表生成两个类:一个称为 ILT.java,一个称为 ILTRESTItem.java,我认为这与将这些类与 REST API 一起使用有关(我不这样做)不打算这样做)。
ILTResItem 类有编译错误。它对 XmlAdapterUtils.unmarshallJAXBElement 做了很多调用,错误消息是:
XmlAdapterUtils 类型中的方法 marshallJAXBElement(Class, QName, Class, BoundType) 不适用于参数(Class, QName, Class, String)
我实际上并不太担心这个错误,因为我宁愿它根本没有创建 ILTResItem 类。其他(较小的)类工作正常,我的目标是让 ILT 做同样的事情。
如果我运行 jaxb2 插件 (maven-jaxb2-plugin) 并使用它来生成类,则不会生成 ILTRESTItem 并且这些类是正确的,但是它们当然缺少 JPA 注释。这让我怀疑 Hyperjaxb3 负责生成 ILTRESTItem 类,但我查看了源代码,希望看到其中包含类似“RestItem”的类,但没有。
一个相关点是我在这里使用单表继承。ILT 类和另一个类 (IFT) 使用相同的基础表 (Transaction),它们都扩展了 Transaction 类。如果我从 Transaction 中分离 ILT 并使其成为非继承类,则 ILTResItem 不再生成。
对 JAXB2 和 HyperJaxb3 进行了大量搜索,但我没有找到对 RestItem 的任何引用,也没有找到生成它的原因(或者它们中的哪一个)。我希望有一些配置开关可以关闭 RestItem 生成,但到目前为止我看不到它。
为了完整起见,我应该补充一点,我尝试切换不同的字段以查看其中一个字段是否是此行为的触发器,而事实并非如此。它实际上似乎是字段的数量,或者可能是记录的总长度。
另外:JPA 2.1 和相关的 Maven 片段是:
<plugin>
<groupId>org.jvnet.hyperjaxb3</groupId>
<artifactId>maven-hyperjaxb3-plugin</artifactId>
<version>0.6.1</version>
<dependencies>
<dependency>
<groupId>com.xyz</groupId>
<artifactId>ims-core-partner</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<variant>jpa2</variant>
<extension>true</extension>
<args>
<arg>-extension</arg>
<arg>-XtoString</arg>
<arg>-Xannotate</arg>
</args>
</configuration>
</plugin>
依赖项是使用 annox 在该附件中获取几个自定义注释。
最后是我的 xsd 文件中的相关片段:
<complexType name="ILT">
<xsd:annotation>
<xsd:appinfo>
<hj:entity>
<orm:inheritance strategy="SINGLE_TABLE"/>
<orm:discriminator-value>ILT</orm:discriminator-value>
</hj:entity>
</xsd:appinfo>
</xsd:annotation>
<xsd:complexContent>
<xsd:extension base="tns:Transaction">
<xsd:sequence>
<element name="iltType" type="tns:ItemType">
</element>
<element name="investmentOrderId" type="string">
</element>
...
只要我的字段列表足够短,这一切都会奏效。