【问题标题】:JAXB auto generated classes hierarchyJAXB 自动生成的类层次结构
【发布时间】:2011-06-07 07:44:22
【问题描述】:

我正在生成基于各种 WSDL 的 java 代码。对于我们发布的每个新版本的 WebService,我们都有不同的 WSDL,每个都有自己的命名空间。

问题是通常从一个版本到另一个版本的更改很少,但我想保持类按命名空间划分。

有没有办法配置 JAXB,以便自动生成的类实现单个接口/扩展单个类,这样我就可以在不更改代码的情况下引用它们中的任何一个?

虚拟示例:

WebService方法:listScripts(ResultSize size);

自动生成的类:

  • com.test.ws1.ResultSize
  • com.test.ws2.ResultSize

两个类完全相同。有没有办法将它们排列在类层次结构中,以便我的代码与版本号的更改隔离?即两个类都实现了com.test.ResultSize 接口?

【问题讨论】:

    标签: code-generation jaxb


    【解决方案1】:

    XJC 有一个为此目的的扩展

    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
               xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
               xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
               jaxb:extensionBindingPrefixes="xjc"
               jaxb:version="2.0">
    
        <xs:annotation>
           <xs:appinfo>
              <jaxb:globalBindings>
               <xjc:superClass name="com.mycompany.xml.UserRootObject"/>
              </jaxb:globalBindings>
           </xs:appinfo>
        </xs:annotation>
    .
    .
    .
    </xs:schema>
    

    欲了解更多信息,请参阅:

    模式注释也可以通过外部绑定文件提供。示例见:

    【讨论】:

    • 很好的答案,虽然这样做的缺点是为所有生成的代码生成一个超类,而不仅仅是一个特定的类。
    • 这没有回答 German 的问题,因为正如他自己所指出的, 适用于所有生成的类,而不仅仅是他想要调整的类......
    【解决方案2】:

    原来我可以使用 JAXB2 Basics 包中提供的插件:

    Inheritance plugin

    有了这个插件,我可以为我生成的超类指定不同的超类,虽然我不能让自动生成的枚举来实现给定的接口。

    在 Maven 中使用它很痛苦(我是从 WSDL 生成类,而不是直接使用 JAXB),所以我切换到 this blog 中指定的外部 Ant 任务

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多