我有一个如下所示的类(来自 Spring Roo DataOnDemand),它返回一个新的瞬态(非持久)对象以用于单元测试。这是我们从 Spring Roo 的 ITD 中推入后代码的样子。
public class MyObjectOnDemand {
public MyObjectOnDemand getNewTransientObject(int index) {
MyObjectOnDemand obj = new MyObjectOnDemand();
return obj;
}
}
我需要做的是对返回的对象引用进行额外调用,以设置 Spring Roo 的自动生成方法无法处理的其他字段。因此,在不修改上述代码(或从 Roo 的 ITD 中推入)的情况下,我想再打一个电话:
obj.setName("test_name_" + index);
为此,我声明了一个新的方面,它具有正确的切入点,并且将建议具体的方法。
public aspect MyObjectDataOnDemandAdvise {
pointcut pointcutGetNewTransientMyObject() :
execution(public MyObject MyObjectDataOnDemand.getNewTransientObject(int));
after() returning(MyObject obj) :
pointcutGetNewTransientMyObject() {
obj.setName("test_name_" + index);
}
}
现在,根据 Eclipse,切入点已正确编写并建议正确的方法。但它似乎并没有发生,因为持久化对象的集成测试仍然失败,因为 name 属性是必需的,但没有被设置。根据 Manning 的 AspectJ in Action(第 4.3.2 节),after 建议应该能够修改返回值。但也许我需要做一个 around() 建议?