如何自定义jaxb生成?

时间:2009-09-08 05:28:00

标签: java xml maven-2 jaxb namespaces

我有一系列xml消息,都有自己的模式和命名空间。消息当前使用JAXB编组(我们仍然生活在Java 1.4环境中),并且我们使用此JAXB代码有大量遗留代码,因此任何解决方案都需要极少干扰。

我的问题是,虽然每个消息都有一组公共标头标签,但命名空间覆盖了整个消息,因此每个消息的标头也是唯一的。因此,使用一个使用非常丑陋的代理类和动态反射代码实现的公共类,将“公共”头部分加载到命名空间绑定版本中。这个常见类已被确定为一些性能问题的根源。

理想情况下,我想使用以下内容实现替换:

  • 使用Maven2替换当前的手动jaxb构建过程。
  • 为“公共”标题生成一次性JAXB类,以便在每条消息中重复使用。
  • 转换当前的动态/代理类以使用上述具体的标题类。
  • 为每条消息的unqiue部分生成JAXB类。

不幸的是,我无法控制消息结构,否则我会考虑创建一个单独的“标头”命名空间。我想在编组之后和解组之前运行一个XSLT转换来“重命名”头名称空间,但是如果可能的话我宁愿避免额外的负载,即使它意味着更复杂的构建。

我想做的是可行的还是我错过了一些基本的东西?有没有关于如何实施的提示?插件版本等?

附录1 :使用 javaType 进行绑定可以完成这项任务,但似乎不适用于复杂类型。

附录2 :使用进行绑定几乎也可以,但我希望它能指定一个特定的类包,这样我就可以忽略生成的重复项。

1 个答案:

答案 0 :(得分:1)

JAXB 2.x有@XmlJavaTypeAdapter注释可能是您问题的解决方案(请参阅Kohsuke Kawaguchi的this blog)。

您可以使用XmlAdapter<XMLHeaderFromNamespaceX, CommonHeader>的实现将公共标头类映射到生成的特定于命名空间的标头类,并将适配器与XmlJavaTypeAdapter一起使用。

但是,作为一个缺点,您需要为每个特定名称空间使用适配器。