操纵JAXB以创建IDREF元素而不是JaxBElement <! - ? - >

时间:2018-03-15 12:49:19

标签: xsd jaxb annox jaxb2-annotate-plugin

我想使用maven-jaxb2-plugin生成类。

我的输入xsd如下所示:

<complexType>
<complexContent>
    <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
        <sequence>
            <element name="ReferencedElementA" type="{http://www.w3.org/2001/XMLSchema}IDREFS" minOccurs="0" />
            <element name="ReferencedElementB" type="{http://www.w3.org/2001/XMLSchema}IDREF"
                maxOccurs="unbounded" minOccurs="0" />
        </sequence>
    </restriction>
</complexContent>

请注意,我无法改变外部客户提供的架构!

这是生成的代码:

@XmlList
@XmlElement(name = "ReferencedElementA")
@XmlIDREF
@XmlSchemaType(name = "IDREFS")
protected List<Object> referencedElementA;
@XmlElementRef(name = "ReferencedElementB", namespace = "ABC", type = JAXBElement.class, required = false)
protected List<JAXBElement<Object>> referencedElementB;

如您所见,“ReferencedElementB”生成为List&gt;使用@ XMLElementRef-Annotation。

我想要的是以下内容:

@XmlElement(name = "ReferencedElementB")
@XmlIDREF
@XmlSchemaType(name = "IDREF")
protected List<Object> referencedElementB;

使用Blaise Doughan中的解决方法,我使用以下代码扩展了我的绑定文件:

<bindings node = ".//xs:element[@name='ReferencedElementB']">
    <class ref="java.lang.Object"/>
</bindings>

这几乎完成了这项工作,产生了这样的代码:

@XmlElement(name = "ReferencedElementB")
@XmlSchemaType(name = "IDREF")
protected List<Object> referencedElementB;

但是,@ XmlIDREF-Annotation仍然缺失。这会在编组过程中产生错误。

我试图通过annox-plugin注入缺少的注释:

<bindings node = ".//xs:element[@name='ReferencedElementB']">
    <class ref="java.lang.Object"/>
    <annox:annotate target="field">@javax.xml.bind.annotation.XmlIDREF</annox:annotate>
</bindings>

但是这一代人失败了

compiler was unable to honor this annox:annotate customization. It is attached to a wrong place, or its inconsistent with other bindings

再一次,我无法改变输入xsd。

提前谢谢!

1 个答案:

答案 0 :(得分:0)

  

请注意,我无法改变外部客户提供的架构!

我一直在这里阅读这篇文章,我总是在想 - 为什么?为什么不能改变架构?

嗯,当然 你可以在编译之前改变模式。采用原始模式并应用补丁/ XSLT /其他任何内容进行修改。只要结果在结构上与原始模式匹配,就可以了。

考虑您的情况:您使用技巧和变通方法来有效地破解生成的代码。与在编译之前修改模式相比,它有多好?我认为它根本不是更好。它更复杂,容易出错,最后你不能说你生成的代码是你架构的反映。实际上,您没有代码的架构。您甚至无法说出被黑客生成的代码是否足以反映原始模式。

在编译之前修改模式非常简单。您可以轻松地比较原始版本与修改版本,并查看更改是否兼容。生成很简单,不需要黑客和解决方法。

现在回答你的问题。

绑定

<annox:annotate target="field">@javax.xml.bind.annotation.XmlIDREF</annox:annotate>

对我来说很好看。出于某种原因,在模式编译期间不会考虑它,这就是您收到错误的原因。

很难说为什么不考虑它。我会尝试以下方法:

  • 检查您是否在编辑中实际包含/打开JAXB2 Basics Annotate插件:

        <plugin>
            <groupId>org.jvnet.jaxb2.maven2</groupId>
            <artifactId>maven-jaxb2-plugin</artifactId>
            <configuration>
                <extension>true</extension>
                <args>
                    <arg>-Xannotate</arg>
                </args>
                <plugins>
                    <plugin>
                        <groupId>org.jvnet.jaxb2_commons</groupId>
                        <artifactId>jaxb2-basics-annotate</artifactId>
                    </plugin>
                </plugins>
            </configuration>
        </plugin>
    
  • 将自定义元素放在自己的bindings元素中。可能由于某种原因,它与class无法一起使用。

我现在看不到更多工作。

如果它没有帮助,请在这里向我发送一个带有最小复制项目的PR:

https://github.com/highsource/jaxb2-annotate-plugin-support

在i / idrefs下

。我来看看。

免责声明:我是的作者。