JAXB2类型限制不起作用?

用户1050755

我已经在github上建立了一个测试单元。有人可以检查一下为什么要解组的XML看起来不错吗?

https://github.com/jjYBdx4IL/misc-tests/blob/master/src/test/java/jjybdx4il/jaxb/bugs/Stackoverflow26618647Test.java

"<?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域模型的自动替代方法有哪些?

Lexicore

好的,我将其发布为答案。

由于这种类型的构造,您遇到了这个问题:

<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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在泛型类中不起作用

来自分类Dev

Swift:将数据填充到UInt8类型的unsafeMutablePointer中不起作用

来自分类Dev

JAXB XmlTransient不起作用

来自分类Dev

JAXB XmlTransient不起作用

来自分类Dev

Jaxb解组不起作用

来自分类Dev

Jaxb2Marshaller模式验证似乎不起作用

来自分类Dev

jaxb2-annotate-plugin不起作用

来自分类Dev

Jaxb2Marshaller模式验证似乎不起作用

来自分类Dev

两类泛型中的一种类型的C#转换不起作用

来自分类Dev

查询限制不起作用

来自分类Dev

MySQL 限制不起作用

来自分类Dev

创建通用类型适配器类不起作用

来自分类Dev

Doctrine2 ODM限制不起作用/ mongodb

来自分类Dev

JAXB转换在Mule中不起作用

来自分类Dev

<ul>类不起作用

来自分类Dev

GPSTracker类不起作用

来自分类Dev

异常类不起作用

来自分类Dev

查找类不起作用

来自分类Dev

伪类不起作用

来自分类Dev

Angular 2 按钮类型提交不起作用

来自分类Dev

类方法不起作用Angular 2 Typescript

来自分类Dev

在类上的Symfony2 Route注释不起作用

来自分类Dev

单击时更改类的颜色不起作用 Angular 2

来自分类Dev

Firebase规则限制书写不起作用

来自分类Dev

Spring Data JPA限制不起作用

来自分类Dev

systemd内存限制不起作用/示例

来自分类Dev

XSD中的限制不起作用

来自分类Dev

Jaxb2使用每个mvn clean软件包重新生成类

来自分类Dev

从JAXB2带注释的类生成XSD,而无需使用APT