我正在开发使用自定义的XJC插件。问题是我得到了
[ERROR] compiler was unable to honor this myPlugin:testAnnotation customization. It is attached to a wrong place, or its inconsistent with other bindings.
line 16 of file:/C:/JaxbPlugin_jar/withInternalBinding/sampleInlineAnnotation.xsd
[ERROR] (the above customization is attached to the following location in the schema)
line 13 of file:/C:/JaxbPlugin_jar/withInternalBinding/sampleInlineAnnotation.xsd
这是我的架构:
<?xml version='1.0' ?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:myPlugin="http://www.example.org"
targetNamespace="http://www.books.org"
xmlns="http://www.books.org"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
jaxb:extensionBindingPrefixes="xjc myPlugin"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
jaxb:version="2.1">
<xs:element name="a" type="xs:string">
<xs:annotation>
<xs:appinfo>
<myPlugin:testAnnotation>test</myPlugin:testAnnotation>
</xs:appinfo>
</xs:annotation>
</xs:element>
</xs:schema>
我没有使用外部绑定配置(没有-b选项)所以
所以似乎<myPlugin:testAnnotation>test</myPlugin:testAnnotation>
出错了。但它在注释标签内,我不知道它为什么不起作用。
答案 0 :(得分:1)
简短的回答是你可能正确地做了一切。您只需要执行插件的下一步,并告诉XJC您看到了自定义。
任何时候没有任何插件会承认&#34;你会得到这个错误。定制。要处理自定义,您通常需要覆盖几个插件方法,然后在处理自定义时,请调用markAsAcknowledged
。
@Override
public List<String> getCustomizationURIs() {
List<String> uris = new ArrayList<>();
uris.add(...);
return uris;
}
@Override
public boolean isCustomizationTagName(String nsUri, String localName) {
return ...;
}
for (CPluginCustomization customization : propertyInfo.getCustomizations()) {
if (isCustomizationTagName(customization.element.getNamespaceURI(),
customization.element.getLocalName())) {
// Apply the customization.
...
// Tell XJC that the customization was consumed.
customization.markAsAcknowledged();
}
}
wrong place
措辞背后的想法是,该插件可能只是在“&#39;属性”中寻找自定义。等级,但文件在课程中有#39;级别(例如,在complexType上)。在这种情况下,插件代码会错过它(因为它没有在classInfo上查找它),因此它不会得到确认。