【问题标题】:JXB How to use different strategies of code generationJXB 如何使用不同的代码生成策略
【发布时间】:2015-09-21 08:51:41
【问题描述】:

通常,JAXB 用于从 xsd 生成代码,它为 xsd complexType 生成带有注释的 java 类,以将其转换为 xml,反之亦然。

我正在尝试实现不同的目标。我想为每个这样的 xsd 元素生成一个数据映射器类。映射器会将生成的类的每个字段与来自另一个数据类型(例如来自数据库或其他流)的值进行映射

所以我需要:对于 xsd 中的每个用户定义的数据类型,在 DataMappermap-<XSD-ComplexDataType-Class>() 中添加一个方法并生成方法体。

为了实现这一点,我认为不可能像run 方法那样在扩展com.sun.tools.internal.xjc.Plugin 的插件中生成此类,我将无法创建新的JDefinedClass

有什么方法可以在Model调用Plugins之前添加一个钩子方法吗?

谢谢,

【问题讨论】:

    标签: jaxb


    【解决方案1】:

    您可以做一些事情。在my other answer 中,我特别指的是这些:

    • 您可以在插件中编写和设置自己的com.sun.tools.xjc.generator.bean.field.FieldRendererFactory。字段渲染器从CPropertyInfos 生成FieldOutlines。这是模型和轮廓之间的一个步骤。因此,如果您希望从模型中生成不同的代码,请考虑实现您自己的FieldRendererFactory。您可以通过 XJC 插件注册FieldRendererFactory(参见Options.setFieldRendererFactory(...))。
    • 在类级别,您可以编写自己的com.sun.tools.xjc.generator.bean.BeanGenerator 并将其用于代码生成。
    • 您可以只使用model 并完全自行生成代码。当我为 XMLJSON 生成 JavaScript 映射时,我在 Jsonix 中执行此操作。

    至于您的具体任务,我实际上只是在您插件的run 方法中对代码模型进行后处理。你拥有一切——modeloutline 以及代码模型(参见outline.getCodeModel())。你绝对可以在那里创建你的JDefinedClasses,代码模型已经存在。

    【讨论】:

    • 是的,我按照你最后所说的那样进行操作,我定义了自己的 JDefinedClass 并向其添加方法。它处于非常初始的阶段。谢谢!
    猜你喜欢
    • 2011-06-21
    • 1970-01-01
    • 2016-01-16
    • 2012-05-06
    • 2021-03-28
    • 2015-07-06
    • 2015-12-06
    • 1970-01-01
    • 2015-08-17
    相关资源
    最近更新 更多