Java JAXB2类型限制不起作用?
我已经在github建立了一个测试单元。尽管要解组的XML看起来不错,但有人能检查一下为什么这不起作用吗Java JAXB2类型限制不起作用?,java,jaxb,unmarshalling,jaxb2,Java,Jaxb,Unmarshalling,Jaxb2,我已经在github建立了一个测试单元。尽管要解组的XML看起来不错,但有人能检查一下为什么这不起作用吗 “\n” +“\n”。。。 最外部的元素GenericDataType被正确实例化。我使用调试器检查了这一点,并在手工构建的公共构造函数中设置了断点。但是,message:Header元素导致BaseHeaderType类的实例化,该类是抽象的 在SDMXMessage.xsd中,明确规定GenericDataType的标头仅限于GenericDataHeaderType: <xs
“\n”
+“\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>
GenericDataType定义通用数据消息的内容。
为什么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 {
}
公共抽象类MessageType{
@xmlement(name=“Header”,required=true)
受保护的BaseHeaderType头;
@xmlanyement(lax=true)
任何受保护的清单;
@XmlElement(name=“Footer”,命名空间=”http://www.sdmx.org/resources/sdmxml/schemas/v2_1/message/footer")
受保护的页脚类型页脚;
公共类GenericDataType
扩展消息类型{
}
有什么我可以做的吗?有没有从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>
MessageType是一种抽象类型,所有消息都使用它来继承公共功能。每条消息都包含一个必需的头,后面是可选的负载(可能出现多次),最后是一个可选的页脚部分,用于传递错误、警告和信息性消息。
GenericDataType定义通用数据消息的内容。
一个元素被限制为更具体的元素/类型(DataSet
)。由于所有属性都已在超级类上定义,XJC不会在“继承类”上生成它们
据我所知,存在许多问题。对于JAXB来说,通过限制进行派生似乎是一个困难的概念
例如,在本例中-您认为GenericDataType
应该是什么样子?您基本上需要重写header
属性以使用更具体的类型。由于XJC将注释放置在字段而不是getter/setter上,我想知道如何重写这样的属性。您可以向handl添加另一个header属性e您的标题
,但是否覆盖
尝试手动编写这样一个类,并使用jaxb:class/@ref
-binding。如果您让它工作起来,这将给出应该生成什么的想法
接下来,通过XJC插件是否可行
您在这里报告的问题实际上是XJC的核心业务。如果有什么问题在那里不起作用,那么“好”的做法是报告(或找到已经报告的问题)并在XJC中解决问题
XJC插件可以做很多事情。你可以完全重组模型和定制生成。通过适当的努力,一切都是可能的
但在这种情况下,这可能是一项冒险的工作。编写高级XJC插件并不容易
如果您对插件应该做什么以及如何在模式派生类中解决这个特定问题有一个很好的概念,请发表您的想法,也许我们可以提供一些指导。就我个人而言,我写的XJC插件可能比其他任何人都多
我希望这能有所帮助。您的日志有什么说明吗?通常您应该得到错误的提示。
any
通常是一个全面的属性,当架构构造对于XJC来说太奇怪时会出现。在您的情况下,您可能会遇到命名冲突。如果存在页眉或页脚,请检查您的消息类型E>元素等,并尝试定制它。我认为它与XJC不处理类型限制。很难说没有图式。OK。是的,你可能对限制是正确的。我不认为它是固定的。考虑编写你自己的类用于<代码> GraceDATA ype <代码>,并用<代码> <代码>自定义。我有1MB的XSD。这样构造的。写一个处理类型限制的xjc插件难道不可行吗?为什么有必要将限制基属性转换为父关系?为什么不简单地将其展开并定义GenericDataType,而不使用父类和类层次结构?xsd限制基属性看起来很简单ike是一条简化XSD编写的捷径……除此之外还有其他用途吗?@user1050755可能你是对的。可能这会通过展平解决。但我不确定这也可能会破坏继承。因此建议映射到手写类(jaxb:class/@ref
)找出一个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>