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

2022-09-02 20:25:24

使用生成的 Java 源代码,如

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

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

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

例如

  • 重写 ToString 方法(用于日志记录)
  • 实现访客模式(用于数据分析/验证)

答案 1

对于 JAXB,请参见添加行为

基本上,您将 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

至于Hibernate,您可以调整代码生成中使用的模板文件以更改其行为。如果你想调整HIbernate Tools,你可以编辑,例如:dao/daohome.ftl

您甚至可以将字段添加到“toString()”输出中,编辑.hbm.xml文件

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

对于日志记录和验证,您都可以考虑将AOP与AspectJ一起使用(我不建议弄乱生成的代码,因为您可能希望从头开始多次构建它)。


推荐