代码之家  ›  专栏  ›  技术社区  ›  mjn anonym

如何扩展JAXB、CXF或Hibernate工具生成的Java代码?

  •  18
  • mjn anonym  · 技术社区  · 16 年前

    用java生成的源代码,喜欢

    • 使用休眠工具生成的代码
    • 使用JAXB模式绑定(XJC)生成的代码
    • 用wdsl2java(cxf)生成的代码

    所有生成的类都是“值对象”类型,没有业务逻辑。如果我将方法添加到生成的源代码中,如果我重复源代码生成,我将释放这些方法。

    这些Java代码生成工具提供了“扩展”生成代码的方法吗?

    例如,

    • 重写ToString方法(用于日志记录)
    • 实现访问者模式(用于数据分析/验证)
    7 回复  |  直到 13 年前
        1
  •  15
  •   Julio Jacob Zwiers    13 年前

    对于JAXB,请参见 Adding Behaviours .

    基本上,您将JAXB配置为返回您通常期望的对象的自定义实例。在下面的示例中,您创建了一个新的对象Personex,它扩展了JAXB对象Person。这种机制可以很好地工作,因为您是从生成的类派生的,根本不改变JAXB类或模式。

    package org.acme.foo.impl;
    
    class PersonEx extends Person {
      @Override
      public void setName(String name) {
        if(name.length()<3) throw new IllegalArgumentException();
        super.setName(name);
      }
    }
    
    @XmlRegistry
    class ObjectFactoryEx extends ObjectFactory {
      @Override
      Person createPerson() {
        return new PersonEx();
      }
    }
    

    请注意,@override指令在JAXB对象更改时非常重要-它将阻止您的自定义 孤儿 .

        2
  •  8
  •   Manrico Corazzi    16 年前

    至于Hibernate,您可以调整代码生成中使用的模板文件来更改它们的行为。如果要调整休眠工具,可以编辑,例如: DAO/DAOHANT.FTL

    您甚至可以向“toString()”输出添加字段,编辑 HBM.XML 文件夹

    ...
    <property name="note" type="string">
        <meta attribute="use-in-tostring">true</meta>
        <column name="note" />
    </property>
    ...
    

    对于日志记录和验证,您可以考虑使用 AOP with AspectJ (我不建议对生成的代码进行处理,因为您可能需要从头构建多次代码)。

        3
  •  4
  •   ShuggyCoUk    16 年前

    首先,我要重申,修改生成的代码有许多与之相关的问题,在可能的情况下,应该避免修改。也就是说,有时避免或更多的工作是不切实际的,而不仅仅是在代码重新生成时处理更改。

    遗憾的是,Java不支持C语言具有的部分类的概念。这些正是为了解决这类问题。

    您应该看看您的代码生成工具是否支持某种形式的有意义的注释,这些注释限定了您在类中添加的区域(这不太可能,如果您修改代码而不是添加到代码中,也不会有帮助)。

    如果您真的希望这样做,最好的选择是最初生成文件,但立即将它们签入版本控制存储库。 然后进行更改,签入。

    下次您重新运行这些工具并让它们覆盖现有的文件时,您可以与受源代码控制的文件进行比较,然后将更改合并回(最简单的更改,如添加新的列/表将不费吹灰之力)。

    如果代码生成器突然生成完全不同的代码(比如一个新版本),那么这对您没有多大帮助,但是在这种情况下,您添加的任何代码(不仅仅是依赖于已经公开的数据/方法的附加便利方法)都会有问题,不管它是如何混合到类中的。但是版本控制系统仍然有帮助,因为它还记录 最初的变化 因此,您可以看到以前添加的内容,以及您需要以新样式重新创建的内容。

        4
  •  3
  •   kgiannakakis    16 年前

    编辑生成的代码文件不是一个好主意,要么编辑它们自己的文件,要么通过子类化。无论您做什么,请确保工具创建的签名保持不变,以便将来可以理解该文件是自动生成的。

    我建议您研究工具的命令选项,看看它们是否允许您使用一些灵活性。一些工具可以生成抽象类或接口,而不是具体的类。如果不可能,请创建一个域对象,该对象将自动生成的对象作为成员变量。

        5
  •  3
  •   willcodejavaforfood    16 年前

    我使用Hibernate的方法是生成我随后扩展的基类。我将所有业务逻辑(如果有的话)添加到这些子类中。我经常也会更改Hibernate使用的FreeMarker模板来进一步自定义生成的类。

        6
  •  1
  •   duffymo    16 年前

    AOP引用是一个很好的引用。我将添加Spring,它内置了非常好的AOP特性。

        7
  •  1
  •   Jon    14 年前

    看一看

    http://code.google.com/p/jaxb-method-inserter/

    它是我写的JAXB的一个小插件,使用起来很简单。希望有帮助