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

mjn*_*mjn 18 java code-generation hibernate cxf jaxb

用生成的Java源代码,比如

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

所有生成的类都是"值对象"类型,没有业务逻辑.如果我向生成的源代码添加方法,如果我重复生成源代码,我将松开这些方法.

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

例如,

  • 覆盖ToString方法(用于记录)
  • 实现访问者模式(用于数据分析/验证)

Bri*_*new 15

对于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();
  }
}
Run Code Online (Sandbox Code Playgroud)

请注意,@ Override指令对于JAXB对象更改很重要 - 它会阻止您的自定义变为孤立.


Man*_*zzi 8

至于Hibernate,您可以调整代码生成中使用的模板文件来改变它们的行为.如果你想调整你可以编辑的HIbernate工具,例如:dao/daohome.ftl

您甚至可以在编辑.hbm.xml文件的"toString()"输出中添加字段

...
<property name="note" type="string">
    <meta attribute="use-in-tostring">true</meta>
    <column name="note" />
</property>
...
Run Code Online (Sandbox Code Playgroud)

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