【问题标题】:How can I customize setters in Spring Roo DBRE-generated entities?如何在 Spring Roo DBRE 生成的实体中自定义设置器?
【发布时间】:2012-01-06 23:41:03
【问题描述】:

这个问题可能会暴露我对 AspectJ 的了解不足,但无论如何:)

我已经成功地使用 Spring Roo 将一组表逆向工程到一个新的 Roo 项目中。我希望能够通过不将我的方面“推送”到普通的旧 Java 类中来保持 Roo 的往返工程方面。但是,我在向 Aspect 中定义的成员字段分配值时遇到了问题。

例如,我有一个 RooDbManaged 实体类,我们称它为 X,而 Roo 生成了一个切面:X_Roo_DbManaged。现在,我想为字段“updateDate”自定义一个设置器,以便我可以将日期分配为持久性时的当前日期。因此,我将自定义代码放在 X 类中,如下所示:

 public void setUpdateDate(Date updateDate) {
    this.updateDate = new Date();
}

正如我所料,这会导致 Roo 从方面删除 setter,因为我现在已经在 X 中定义了它。

这给了我一个错误: X.updateDate 字段不可见

如果我将 X_Roo_DbManaged 方面中字段的可见性更改为“公共”(我不想这样做),这将解决问题,直到 Roo 自动重新生成导致错误再次发生的方面。

我的猜测是我遗漏了一些如此明显的东西,以至于没有人认为值得发布,因为我通常成功的谷歌搜索未能找到任何解决方案!

我应该补充一点,我的解决方法是通过将 X_Roo_Controller 中的相关方法移动到 XController 中并使用未修改的设置器在那里分配日期来自定义 X_Roo_Controller 中的相关方法。这似乎与直觉相反,因为我真的希望 updateDate 在设置时始终是当前日期。有趣的是,更新日期字段上的 Roo 生成的 @Temporal(TemporalType.TIMESTAMP) 注释不提供此功能。我真的很希望能够用 Roo 命令告诉 Roo,某些 DBRE 字段应该具有这种行为,而不必担心本质上是“管道”。

【问题讨论】:

    标签: java spring aspectj spring-roo


    【解决方案1】:

    我建议你使用@PrePersist@PreUpdate 而不是破解setter

    public class X {
       @PreUpdate
       public void beforeSaving() {
          this.setUpdateDate(new Date());
       }
    }
    

    否则,您仍然可以将字段本身从 X_Roo_DbManaged.aj 放入 X.java 文件,但您将失去对该字段进行增量逆向工程的能力。

    【讨论】:

      【解决方案2】:

      您可以将字段 updateDate 移动到 X.java 中以使其可见。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多