JAXB根类使用binding.xml重命名 [英] JAXB Root Class Rename using binding.xml

查看:75
本文介绍了JAXB根类使用binding.xml重命名的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用Eclipse中的Dali插件使用xsd文件生成Java类,该文件实际上只是在模式文件上调用xjc。我使用了此处的建议来解决命名冲突通过将XML绑定文件应用于类生成。这很好用,但我试图通过重命名根元素更进一步,结果是我丢失了XmlRootElement注释。我尝试使用annox来添加根元素注释,但是我得到了这个错误:不支持的绑定命名空间 http:// annox.dev.java.net 。也许你的意思是 http://java.sun.com/xml/ns/jaxb/xjc

I use the Dali plugin in Eclipse to generate Java classes using an xsd file, which essentially just invokes xjc on the schema file. I used the advice here to resolve naming conflicts by applying an XML binding file to the class generation. This worked well, but I tried to take it a step further by renaming the root element, and the result was that I lost the XmlRootElement annotation. I tried using annox to add the root element annotation back in, but I get this error: Unsupported binding namespace "http://annox.dev.java.net". Perhaps you meant "http://java.sun.com/xml/ns/jaxb/xjc"?

这是我的初始binding.xml文件(没有annox):

Here is my initial binding.xml file (without annox):

<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd"
    version="2.1">
    <!-- Force all classes to be generated at the top level, this will potentially cause name conflicts -->
    <jaxb:globalBindings localScoping="toplevel"/>
    <jaxb:bindings schemaLocation="mySchema-1.0.0.xsd">
        <!-- Rename the root element -->
        <jaxb:bindings node="//xs:element[@name='MyRootClassNameIsReallyLong']/xs:complexType">
            <jaxb:class name="ShorterName"/>
        </jaxb:bindings>
        <!-- Rename the Bar class to resolve a naming conflict -->
        <jaxb:bindings node="//xs:element[@name='Foo']/xs:complexType/xs:sequence/xs:element[@name='Bar']/xs:complexType">
            <jaxb:class name="FooBar"/>
        </jaxb:bindings>
    </jaxb:bindings>
</jaxb:bindings>

顺便说一下,值得注意的是架构文件来自第三方,所以我没有有兴趣修改它。同样,我宁愿不篡改生成的Java文件,这就是我对绑定xml方法感兴趣的原因。

By the way, it's worth noting that the schema file came from a third party, so I have no interest in modifying it. Likewise, I'd rather not tamper with the generated Java files, so that's why I am interested in the binding xml approach.

编辑(2013年11月9日) - 以下是与annox的绑定XML:

Edit (9/11/2013) - Here is the binding XML with annox:

<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd"
    xmlns:annox="http://annox.dev.java.net"
    version="2.1">
    <!-- Force all classes to be generated at the top level, this will potentially cause name conflicts -->
    <jaxb:globalBindings localScoping="toplevel"/>
    <jaxb:bindings schemaLocation="mySchema-1.0.0.xsd">
        <!-- Rename the root element -->
        <jaxb:bindings node="//xs:element[@name='MyRootClassNameIsReallyLong']/xs:complexType">
            <jaxb:class name="ShorterName"/>
            <annox:annotate>
                <annox:annotate annox:class="javax.xml.bind.annotation.XmlRootElement" name="MyRootClassNameIsReallyLong" />
            </annox:annotate>
        </jaxb:bindings>
        <!-- Rename the Bar class to resolve a naming conflict -->
        <jaxb:bindings node="//xs:element[@name='Foo']/xs:complexType/xs:sequence/xs:element[@name='Bar']/xs:complexType">
            <jaxb:class name="FooBar"/>
        </jaxb:bindings>
    </jaxb:bindings>
</jaxb:bindings>


推荐答案

Annox是一个XJC添加,所以你另外要声明命名空间prefx( xmlns:annox =http://annox.dev.java.net ),您还需要将其声明为 extensionBindingPrefix

Annox is an XJC add on, so you in addition to declaring the namespace prefx (xmlns:annox="http://annox.dev.java.net), you also need to declare it as an extensionBindingPrefix.

您的开放标记应该如下所示:

Your openning tag should then look like this:

<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
               xmlns:xs="http://www.w3.org/2001/XMLSchema"
               xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"                 
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://java.sun.com/xml/ns/jaxb 
                                   http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd"
               jaxb:extensionBindingPrefix="annox"
               version="2.1">

这篇关于JAXB根类使用binding.xml重命名的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆