1

我有一个如下所示的类(来自 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() 建议?

4

3 回答 3

3

我会在 tgharold 回复中添加评论,但没有足够的声誉。(这是我的第一篇文章)

我知道这是旧的,但我认为它可以帮助其他正在寻找这里的人知道可以在 AspectJ 中使用thisJoinPoint.

例如:

after() : MyPointcut() {
    Object[] args = thisJoinPoint.getArgs();
    ...

更多信息请访问:http ://eclipse.org/aspectj/doc/next/progguide/language-thisJoinPoint.html 。

希望它对某人有用。

于 2013-10-03T11:20:24.560 回答
0

这是使用周围的示例:

pointcut methodToMonitor() : execution(@Monitor * *(..));

Object around() : methodToMonitor() {
    Object result=proceed();

    return result;
}
于 2012-11-15T20:11:14.803 回答
0

所以,事实证明我被 Eclipse 中的一个错误所困扰,因为它没有正确地编织东西。在 Spring Roo shell 中运行“执行测试”使一切正常,但是将包作为 JUnit 测试用例运行却不起作用。

上面的代码使用“返回后”建议确实有效。但是您也可以使用“around”通知来实现它,它允许您访问传递给方法的参数。

 MyObject around(MyObjectDataOnDemand dod, int index) :
    pointcutGetNewTransientMyObject() 
    && target(dod) && args(index) {

     // First, we go ahead and call the normal getNewTransient() method
     MyObject obj = proceed(dod, index);

     /*
     * Then we set additional properties which are required, but which
     * Spring Roo's auto-created DataOnDemand method failed to set.
     */
     obj.setName("name_" + index);

     // Lastly, we return the object reference
     return obj;
 }

对于我们的特殊情况,“返回后”建议更加简洁易读。但是了解如何使用“around”建议来访问参数也很有用。

于 2012-11-14T02:35:44.043 回答