两组 JAXB 模型共享同一组接口

Two sets of JAXB models sharing the same set of interfaces

我想从同一个 XSD 创建两个单独的 JAXB 包,其中一个包的实现 类 是可变的,而另一个是不可变的。 自然地,我希望这两个包中的每一对实现 类 都实现一个共享接口。

例如,以下结果结构将是理想的:

my.model.Model - 只读接口

my.model.impl.ModelImpl implements my.model.Model - 可变实现

my.model.immutable.Model implements my.model.Model - 不可变实现

使用 globalBindings XJB 元素的 generateValueClass="true" 选项创建接口和可变实现非常简单。

至于不可变的实现,XJC 似乎无法开箱即用,我可能需要为自己的目的分叉 immutable-xjc 插件。

编写一个导致生成的 类 实现所需接口的 XJC 插件很容易完成(隐藏枚举 类 对不可变包来说是多余的),但是,我相当坚持尝试通过删除现有字段并将它们添加到其他类型来更改 JAXB 模型。即使给出了 lexicore 的有用答案 here,我仍然不清楚应该在 Codemodel 模型的何处进行此类更改,以便 XJC 接受这些更改并照常继续,或者即使此类功能是可能的。

在 XJC 插件中使用 Codemodel 的综合指南是否随处可用?

或者更好的是,是否有不同的方法来完成此操作?

这可不简单。

据我所知,XJC 内部没有真正的 "guide"。我必须边做边学。您可能想看看一些现有的 XJC 插件,看看它们是如何完成任务的。

我也不太清楚你为什么需要 "remove existing fields and add them with other types"。对我来说,这似乎与您的任务不一致。

我会将此任务分解为三个任务:

  1. 在指定包中生成不可变接口。
  2. 自动实现指定包的接口。
  3. 生成不可变 类。

在构建中,我将定义 3 个执行:

  • 生成不可变接口(使用 1)。
  • 生成可变 类(正常 XJC + 2)。
  • 生成不可变的 类 (3 + 2).

immutable-xjc 可能已经实现了 3,所以我会为 1 和 2 编写插件。

对于 1 和 2,我想,我会尝试在 CodeModel 级别上工作。只用生成的 类,不要弄乱模型和轮廓。

1、你基本上只需要从JDefinedClass一个只读接口"extract",这个应该是可以的。

2应该更容易。对于每个 com.acme.impl.Foo,您需要根据包映射 com.acme.impl -> com.acme.

添加 implements com.acme.Foo

在实践中,您可能会遇到各种问题,例如泛型等,但这可能无法通过此任务来避免。

如果您想深入了解,请查看 BeanGeneratorFieldRendererFactory。这些负责从模型中生成轮廓。因此,如果您想在更深层次上工作(而不仅仅是在 CodeModel 表面),您可能必须实现自己的生成器和字段渲染器工厂。但这可能会很混乱。该区域的许多中央 XJC 类 都受包保护,因此您要么必须复制粘贴,要么解决这个问题。我认为,在 CodeModel 级别上工作就足够了。