首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何扩展JAXB、CXF或Hibernate工具生成的Java代码?

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

Stack Overflow用户
提问于 2009-04-23 06:55:26
回答 7查看 13.4K关注 0票数 18

使用生成的Java源代码,例如

使用Hibernate工具生成的

  • 代码

使用JAXB架构绑定(Xjc)生成的

  • 代码

使用WDSL2Java (cxf)生成的

  • 代码

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

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

例如,

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

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-04-23 09:20:03

对于JAXB,请参阅Adding Behaviours

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

代码语言:javascript
复制
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对象发生更改的情况下非常重要-它将防止您的定制成为孤立的。

票数 15
EN

Stack Overflow用户

发布于 2009-04-23 07:41:03

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

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

代码语言:javascript
复制
...
<property name="note" type="string">
    <meta attribute="use-in-tostring">true</meta>
    <column name="note" />
</property>
...

对于日志和验证,您都可以考虑使用AOP with AspectJ (我不建议修改生成的代码,因为您可能希望从头开始多次构建)。

票数 8
EN

Stack Overflow用户

发布于 2009-04-23 07:42:49

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

遗憾的是,java不支持c#所具有的分部类的概念。这些都是为了解决这类问题。

您应该查看您的代码生成工具是否支持某种形式的有意义的注释,这些注释可以分隔您自己在类中添加的区域(如果您正在修改代码,而不是添加到代码中,这是不太可能的,也不会有任何帮助)

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

下次您重新运行这些工具并让它们覆盖现有文件时,您可以与受源代码控制的文件进行比较,并将更改合并回来(大多数微不足道的更改,如添加新的列/表,都将是微不足道的。

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/780567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档