我们的服务使用带有复杂嵌套结构,IDREF,模式导入等的大型一体适用模式的wsdls。
因此,任何服务都不会使用模式中描述的所有元素。实际服务仅使用相对较小的模式子集。 从模式生成JAXB bean会产生笨重的对象,这些对象具有许多未使用的属性。
我知道我可以编写自己的JAXB bean并只包含有趣的属性。在编组期间,JAXB将忽略其余部分。
然而,模式和xml响应的结构非常复杂,足以让我希望我可以生成JAXB bean并以某种方式告诉xjc它应该包含哪些元素。
这可能吗?是否有一个xjc插件可以做到这一点?或者除了RI之外还有一个JAXB实现可以做到吗?
我知道还有其他技术,例如基于xpath的宽容阅读器。但我想知道JAXB是否可以在这里使用。
答案 0 :(得分:1)
据我所知,在XJC中没有包含/排除元素的内置机制。但是,你可以使用一些技巧:
jaxb:class/@ref
绑定以禁止生成不必要的类。据我所知,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页面上的链接已被破坏。