告诉 JAXB 绑定编译器要包含哪些元素

Tell JAXB binding compiler which elements to include

我们的服务使用具有复杂嵌套结构、IDREF、模式导入等的通用大模式的 wsdl。

因此,没有服务会使用模式中描述的所有元素。真正的服务只使用相对较小的模式子集。 从模式生成 JAXB bean 会生成笨重的对象,其中包含许多大部分未使用的属性。

我知道我可以编写自己的 JAXB bean 并且只包含有趣的属性。 JAXB 将在编组期间忽略其余部分。

但是,模式的结构和 xml 响应非常复杂,我希望可以生成 JAXB bean 并以某种方式告诉 xjc 它应该包含哪些元素。

这可能吗?是否有一个 xjc 插件可以做到这一点?或者是否有除 RI 之外的 JAXB 实现可以做到这一点?

我知道还有其他技术,例如基于 xpath 的容错 reader。但是我想知道这里能不能用JAXB

据我所知,在 XJC 中没有 include/exclude 元素的内置机制。但是,您可以使用一些技巧:

  • 创建一个导入您的架构的附加架构,并定义一些仅引用您需要的 elements/types 的元素。然后只编译你的模式。 XJC 将(可能)只编译所需的东西。但我不确定。
  • 尝试 jaxb:class/@ref 绑定以抑制生成不必要的 类。
  • (硬核级别。)XJC 插件可以操纵模型并从中删除类信息或 属性 信息。

据我所知,除 XJC 外,没有其他适用于 JAXB 的模式编译器。

我找到了一个 sample XJC plugin,它做的事情非常相似,它允许在包级别抑制类型并操纵 类 和属性,如下所示。

<jxb:bindings schemaLocation="Person.xsd">
    <tpi:package removeClass="com.captech.person.Extra"/>
    <jxb:bindings node="//xs:complexType[@name='Name']">
        <tpi:class getLastName="public synchronized" 
                    setFirstName="public synchronized"/>
        <tpi:class setLastName="public synchronized"/>
        <jxb:bindings node=".//xs:element[@name='FirstName']">
            <tpi:property modifiers="private"/>
        </jxb:bindings>
    </jxb:bindings>
</jxb:bindings>

该博客文章也是最有用的,因为它展示了如何调试自定义 XJC 插件 - 此信息以前在 Nabble 中,但 JAXB2 页面上的 link 现在已损坏。