我想使用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。
提前谢谢!
答案 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下。我来看看。
免责声明:我是annox,jaxb2-annotate-plugin和maven-jaxb2-plugin的作者。