0

我想使用 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”生成为带有@XMLElementRef-Annotation 的List>。

我想要的是如下所示:

@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。

先感谢您!

4

1 回答 1

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 下。我会看看。

免责声明:我是作者。

于 2018-03-17T16:36:20.107 回答