我有一个如下所示的类(来自 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() 建议呢?
我本来会在 tgharold 回复中添加评论,但没有足够的声誉。 (这是我的第一篇文章)
我知道这已经过时了,但我认为它可以帮助其他正在此处查看的人知道可以使用 AspectJ 中的前建议或后建议中获取参数thisJoinPoint
.
例如:
after() : MyPointcut() {
Object[] args = thisJoinPoint.getArgs();
...
更多信息请访问:http://eclipse.org/aspectj/doc/next/progguide/language-thisJoinPoint.html.
希望它对某人有用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)