我想从同一个XSD创建两个独立的JAXB包,其中一个包的实现类是可变的而另一个是不可变的。 当然,我希望两个包中的每对实现类都实现一个共享接口。
例如,以下结果将是理想的:
my.model.Model
- 只读界面
my.model.impl.ModelImpl implements my.model.Model
- 可变实施
my.model.immutable.Model implements my.model.Model
- 不可变的实现
使用generateValueClass="true"
XJB元素的globalBindings
选项创建接口和可变实现非常简单。
对于不可变的实现,XJC似乎不能完成这个开箱即用,我可能需要为我自己的目的分叉immutable-xjc插件。
编写一个导致生成的类实现所需接口的XJC插件很容易完成(就像隐藏对于不可变包而言冗余的枚举类),但是,我很难通过删除来尝试更改JAXB模型现有字段并将其与其他类型相加。即使给出了lexicore的有用答案here,我仍然不清楚在Codemodel模型上应该进行哪些更改,以便XJC接收这些更改并像往常一样继续,或者即使这样的功能是可能的。< / p>
是否可以在任何地方使用XJC插件中使用Codemodel的综合指南?
或者更好的是,有没有不同的方法来实现这个目标?
答案 0 :(得分:1)
这不是一件容易的事。
据我所知,没有真正的&#34;指南&#34;在XJC内部。我不得不边做边学。您可能需要查看一些现有的XJC插件,以了解它们如何完成任务。
我也不太清楚为什么你要删除现有的字段并将其添加到其他类型的字段中。&#34;。对我来说,这似乎与你的任务不一致。
我将这项任务分解为三个任务:
在构建中我定义了3个执行:
immutable-xjc
可能已经实现了3,所以我为1和2编写了插件。
对于1和2,我认为,我尝试使用CodeModel级别。只需使用生成的类,而不是弄乱模型和大纲。
在1中,你基本上只需要提取&#34;提取&#34;来自JDefinedClass
的只读界面,这应该是可能的。
2应该更容易。对于每个com.acme.impl.Foo
,您需要根据包映射implements com.acme.Foo
- &gt;添加com.acme.impl
。 com.acme
。
在实践中,你可能会遇到各种各样的问题,例如泛型等,但这可能无法通过这项任务来避免。
如果您想要更深入的潜水,请查看BeanGenerator
和FieldRendererFactory
。那些负责从模型中生成轮廓。因此,如果您希望在更深层次上工作(而不仅仅是在CodeModel表面上),您可能必须实现自己的生成器和字段渲染器工厂。但那可能会非常混乱。该领域的许多中央XJC课程都受到包保护,因此您必须复制粘贴或解决此问题。我认为,处理CodeModel级别应该足够了。