我有一系列xml消息,都有自己的模式和命名空间。消息当前使用JAXB编组(我们仍然生活在Java 1.4环境中),并且我们使用此JAXB代码有大量遗留代码,因此任何解决方案都需要极少干扰。
我的问题是,虽然每个消息都有一组公共标头标签,但命名空间覆盖了整个消息,因此每个消息的标头也是唯一的。因此,使用一个使用非常丑陋的代理类和动态反射代码实现的公共类,将“公共”头部分加载到命名空间绑定版本中。这个常见类已被确定为一些性能问题的根源。
理想情况下,我想使用以下内容实现替换:
不幸的是,我无法控制消息结构,否则我会考虑创建一个单独的“标头”命名空间。我想在编组之后和解组之前运行一个XSLT转换来“重命名”头名称空间,但是如果可能的话我宁愿避免额外的负载,即使它意味着更复杂的构建。
我想做的是可行的还是我错过了一些基本的东西?有没有关于如何实施的提示?插件版本等?
附录1 :使用 javaType 进行绑定可以完成这项任务,但似乎不适用于复杂类型。
附录2 :使用类进行绑定几乎也可以,但我希望它能指定一个特定的类和包,这样我就可以忽略生成的重复项。
答案 0 :(得分:1)
JAXB 2.x有@XmlJavaTypeAdapter
注释可能是您问题的解决方案(请参阅Kohsuke Kawaguchi的this blog)。
您可以使用XmlAdapter<XMLHeaderFromNamespaceX, CommonHeader>
的实现将公共标头类映射到生成的特定于命名空间的标头类,并将适配器与XmlJavaTypeAdapter
一起使用。
但是,作为一个缺点,您需要为每个特定名称空间使用适配器。