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

时间:2015-09-14 08:17:41

标签: jaxb xjc

我们的服务使用带有复杂嵌套结构,IDREF,模式导入等的大型一体适用模式的wsdls。

因此,任何服务都不会使用模式中描述的所有元素。实际服务仅使用相对较小的模式子集。 从模式生成JAXB bean会产生笨重的对象,这些对象具有许多未使用的属性。

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

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

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

我知道还有其他技术,例如基于xpath的宽容阅读器。但我想知道JAXB是否可以在这里使用。

2 个答案:

答案 0 :(得分:1)

据我所知,在XJC中没有包含/排除元素的内置机制。但是,你可以使用一些技巧:

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

据我所知,JAXB没有其他模式编译器,而不是XJC。

答案 1 :(得分:0)

我找到了一个非常相似的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页面上的链接已被破坏。