这个问题可能会暴露我对AspectJ缺乏了解,但无论如何都会这样:)
我已经成功地将Spring Roo用于数据库反向工程将一堆表格转换为新的Roo项目。我希望能够通过“推动”来保持Roo的往返工程方面。我的方面成为普通的旧Java类。但是,我遇到了为Aspect中定义的成员字段分配值的问题。
例如,我有一个RooDbManaged实体类,让我们称之为X,而Roo已经生成了一个方面:X_Roo_DbManaged。现在,我想为字段自定义一个setter" updateDate'这样我就可以将日期指定为持久性时的当前日期。所以,我已将我的自定义代码放在类X中,如下所示:
public void setUpdateDate(Date updateDate) {
this.updateDate = new Date();
}
public void setUpdateDate(Date updateDate) {
this.updateDate = new Date();
}
这会导致Roo从方面移除setter,正如我所料,因为我现在已经在X中定义了它。
这给了我一个错误: 字段X.updateDate不可见
如果我将X_Roo_DbManaged方面中字段的可见性更改为' public' (这是我不愿意做的事情),这解决了这个问题,直到Roo自动重新生成导致错误重现的方面。
我的猜测是,我错过了一些显而易见的事情,没有人认为值得发帖,因为我通常成功的谷歌搜索未能找到任何解决方案!
我应该补充一点,我的解决方法是通过将X_Roo_Controller中的相关方法移动到XController并使用未修改的setter分配日期来自定义相关方法。这似乎是反直觉的,因为我真的希望updateDate始终是设置时的当前日期。有趣的是,updateDate字段上的Roo生成的@Temporal(TemporalType.TIMESTAMP)注释不提供此功能。我真的希望能够告诉Roo一个Roo命令,某些DBRE字段应该有这种行为,而不必担心本质上是什么' plumbing'。
答案 0 :(得分:2)
我建议您使用@PrePersist
和@PreUpdate
而不是黑客入侵者
public class X {
@PreUpdate
public void beforeSaving() {
this.setUpdateDate(new Date());
}
}
否则,您仍然可以将字段本身从X_Roo_DbManaged.aj
放入X.java
文件,但是您将失去对该字段进行递增反向工程的功能。
答案 1 :(得分:0)
您可以将字段updateDate移动到X.java中以使其可见。