我已经在github上建立了一个测试单元。有人可以检查一下为什么要解组的XML看起来不错吗?
"<?xml version=\"1.0\" encoding=\"UTF-8\"?><message:GenericData xmlns:message=\"http://www.sdmx.org/resources/sdmxml/schemas/v2_1/message\" xmlns:common=\"http://www.sdmx.org/resources/sdmxml/schemas/v2_1/common\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:generic=\"http://www.sdmx.org/resources/sdmxml/schemas/v2_1/data/generic\" xsi:schemaLocation=\"http://www.sdmx.org/resources/sdmxml/schemas/v2_1/message https://sdw-wsrest.ecb.europa.eu/vocabulary/sdmx/2_1/SDMXMessage.xsd http://www.sdmx.org/resources/sdmxml/schemas/v2_1/common https://sdw-wsrest.ecb.europa.eu/vocabulary/sdmx/2_1/SDMXCommon.xsd http://www.sdmx.org/resources/sdmxml/schemas/v2_1/data/generic https://sdw-wsrest.ecb.europa.eu/vocabulary/sdmx/2_1/SDMXDataGeneric.xsd\">\n"
+ "<message:Header>\n" ...
最外面的元素GenericDataType正确实例化。我检查了使用调试器并将断点设置为手工制作的公共构造函数。但是,message:Header元素导致实例化BaseHeaderType类,该类是抽象的。
在SDMXMessage.xsd中,明确声明了GenericDataType的标头仅限于GenericDataHeaderType:
<xs:complexType name="GenericDataType">
<xs:annotation>
<xs:documentation>GenericDataType defines the contents of a generic data message.</xs:documentation>
</xs:annotation>
<xs:complexContent>
<xs:restriction base="MessageType">
<xs:sequence>
<xs:element name="Header" type="GenericDataHeaderType"/>
<xs:element name="DataSet" type="data:DataSetType" minOccurs="0" maxOccurs="unbounded"/>
<xs:element ref="footer:Footer" minOccurs="0"/>
</xs:sequence>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
为什么xjc在代码生成过程中会忽略它?
public abstract class MessageType {
@XmlElement(name = "Header", required = true)
protected BaseHeaderType header;
@XmlAnyElement(lax = true)
protected List<Object> any;
@XmlElement(name = "Footer", namespace = "http://www.sdmx.org/resources/sdmxml/schemas/v2_1/message/footer")
protected FooterType footer;
public class GenericDataType
extends MessageType {
}
有什么我可以做的吗?从实际有效的XSD文件创建Java域模型的自动替代方法有哪些?
好的,我将其发布为答案。
由于这种类型的构造,您遇到了这个问题:
<xs:complexType name="MessageType" abstract="true">
<xs:annotation>
<xs:documentation>MessageType is an abstract type which is used by all of the messages, to allow inheritance of common features. Every message consists of a mandatory header, followed by optional payload (which may occur multiple times), and finally an optional footer section for conveying error, warning, and informational messages.</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:element name="Header" type="BaseHeaderType"/>
<xs:any namespace="##targetNamespace" minOccurs="0" maxOccurs="unbounded"/>
<xs:element ref="footer:Footer" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
...
<xs:complexType name="GenericDataType">
<xs:annotation>
<xs:documentation>GenericDataType defines the contents of a generic data message.</xs:documentation>
</xs:annotation>
<xs:complexContent>
<xs:restriction base="MessageType">
<xs:sequence>
<xs:element name="Header" type="GenericDataHeaderType"/>
<xs:element name="DataSet" type="data:DataSetType" minOccurs="0" maxOccurs="unbounded"/>
<xs:element ref="footer:Footer" minOccurs="0"/>
</xs:sequence>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
一个元素仅限于更特定的元素/类型(DataSet
)。由于所有属性均已在超类上定义,因此XJC不会在“继承类”上生成它们
据我所知,JAXB RI中存在许多关于限制的问题。对于JAXB,通过限制进行派生似乎是一个很难的概念。
例如,在这种情况下-您认为GenericDataType
应该是什么样子?基本上,您需要重写该header
属性以使用更特定的类型。由于XJC在字段而不是getter / setter上放置注释,所以我想知道如何覆盖这样的属性。您可以添加另一个标头属性来处理您的header
,但可以覆盖吗?
尝试手动编写此类,并使用jaxb:class/@ref
-binding。如果您使它起作用,那么将使您对应该生成的内容有所了解。
接下来,是否可以通过XJC插件进行操作。
您在此处报告的问题实际上是XJC的核心业务。如果那里不起作用,那么“好”的事情就是报告(或找到已经报告的问题)并在XJC中修复该问题。
XJC插件确实可以做很多事情。您可以完全重组模型并定制生成。通过适当的努力,一切皆有可能。
但是在这种情况下,这可能是冒险的。编写高级XJC插件并不容易。
如果您对插件应该做什么以及如何在架构派生类中解决此特定问题有一个很好的概念,请发表您的想法,也许我们将能够提供一些指导。我个人而言,我编写的XJC插件可能比其他任何人都多。
我希望这有帮助。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句