【发布时间】:2015-07-23 09:48:18
【问题描述】:
总之
是否有任何 JAXB 绑定可以告诉 JAXB 代码生成器生成 Java 类为 abstract而不必在 XSD 中将相应的 XML 类型标记为 abstract?
说明
情况如下:
- 我在 XSD 中定义了一个模式:
mySchema.xsd -
我使用内联 JAXB 绑定(“内联”==“直接在模式中”)来指示应该生成 JAXB 类的包(
my.package.jaxb):<xs:annotation> <xs:appinfo> <jxb:schemaBindings> <jxb:package name="my.package.jaxb"/> </jxb:schemaBindings> </xs:appinfo> </xs:annotation> -
我使用内联 JAXB 绑定来指示每个复杂类型的实现类的名称(在此示例中为
my.package.impl.MyAbstractClass、my.package.impl.MyAClass和my.package.impl.MyBClass):<xs:complexType name="myAbstractType" abstract="true"> <xs:annotation> <xs:appinfo> <jxb:class implClass="my.package.impl.MyAbstractClass"/> </xs:appinfo> </xs:annotation> ... </xs:complexType> <xs:complexType name="myAType"> <xs:annotation> <xs:appinfo> <jxb:class implClass="my.package.impl.MyAClass"/> </xs:appinfo> </xs:annotation> <xs:complexContent> <xs:extension base="myAbstractType"> ... </xs:extension> </xs:complexContent> </xs:complexType> <xs:complexType name="myBType"> <xs:annotation> <xs:appinfo> <jxb:class implClass="my.package.impl.MyBClass"/> </xs:appinfo> </xs:annotation> <xs:complexContent> <xs:extension base="myAbstractType"> ... </xs:extension> </xs:complexContent> </xs:complexType> -
我从模式生成 JAXB 类。这导致:
my.package.jaxb |- MyAbstractType |- MyAType (extends MyAbstractClass) |- MyBType (extends MyAbstractClass) -
我自己编写类:
my.package.impl |- MyAbstractClass (extends MyAbstractType) |- MyAClass (extends MyAType) |- MyBClass (extends MyBType)
我这样做的原因是使用这两个类层次结构,以便我可以将生成的代码 (my.package.jaxb.*) 与手册 (my.package.impl.*) 分开。这样,当 XSD 发生更改时,我可以重新生成 my.package.jaxb.* 类并在我的手册 my.package.impl.* 类中进行一些更改以合并新行为。
到目前为止一切顺利。问题是在MyAbstractClass 我想定义一个 abstract 方法...
protected abstract void doSomething();
...然后MyAClass 和MyBClass 以不同方式实现。
但是,生成的 MyAType 和 MyBType 类现在存在编译错误,因为它们没有被声明为抽象,但它们现在继承了一个抽象方法(请注意,它们都扩展了 MyAbstractClass)。 p>
我不能在 XSD (abstract="true") 中将它们声明为抽象,因为这样做会在我在 XML 中声明 myAType 或 myBType 类型的元素时导致以下错误:
cvc-type.2: The type definition cannot be abstract for element someElementName.
我想要的是使用一些 JAXB 绑定来告诉 JAXB 代码生成器将 MyAType 和 MyBType 类生成为 abstract 而不必将 XML 类型标记为 abstract时间>。有这样的绑定吗?到现在都没找到。
抱歉,解释太长了,提前致谢。
【问题讨论】: