XJC插件自定义

时间:2016-07-12 20:53:33

标签: java plugins jaxb xjc

我正在开发使用自定义的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选项)所以

  1. &#34;它附在错误的地方&#34;
  2. &#34; 所以它与其他绑定不一致&#34; - 我只有一个自定义项,而且我没有使用外部绑定文件
  3. 所以似乎<myPlugin:testAnnotation>test</myPlugin:testAnnotation>出错了。但它在注释标签内,我不知道它为什么不起作用。

1 个答案:

答案 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上查找它),因此它不会得到确认。