首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有null的SpringAOP演示代码中有问题

带有null的SpringAOP演示代码中有问题
EN

Stack Overflow用户
提问于 2016-03-22 07:20:33
回答 1查看 65关注 0票数 0

我正在学习Spring。我只是编写了一些非常简单的代码来尝试一下,我不明白为什么在我的测试代码中调用ControllerImpl的登录方法之后,"re"是空的。

我只知道Spring是如何工作的,也许这就是我无法理解失败的原因。

也许您可以在AopTest.java.I使用最新的STS作为我的IDE来运行这个测试。

我使用STS来调试我的代码,但是Spring使用动态代理,所以我看不到详细信息。

您将看到这样的“结果=空”:

单击此处查看我的测试输出。

这是我的测试,code.At,Github。

代码语言:javascript
复制
public class AopTest {

@Autowired
private Controller_ con;

@Test
public void testControllerWithCorrectUid(){
    System.out.println("==============================================");
    String re = con.login(123);
    System.out.println("result = " + re);
    System.out.println("==============================================");
    assertEquals("success",re);
}

@Test
public void testControllerWithWrongUid(){
    System.out.println("==============================================");
    String re = con.login(456);
    System.out.println("result = " + re);
    System.out.println("==============================================");
    assertEquals("fail",re);
}

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-22 09:02:09

我将分两部分回答:

我使用STS来调试我的代码,但是Spring使用动态代理,所以我看不到细节。首先,您可以从Spring框架加载源代码,并在它的内部类中执行一步,直到它到达您的类为止,但是您可以只在建议和建议的方法中添加断点。

然后,当控制器的返回值中没有一个为null时,控制器返回null的实际原因。在看到输出后,我假设login方法确实返回了一个null字符串值,可能是success。但你的建议没能传回给打电话的人。

春季参考手册指出(强调我的):

invoke()方法应该返回调用的结果:连接点的返回值。

甚至举了一个例子:

代码语言:javascript
复制
public class DebugInterceptor implements MethodInterceptor {

    public Object invoke(MethodInvocation invocation) throws Throwable {
        System.out.println("Before: invocation=[" + invocation + "]");
        Object rval = invocation.proceed();
        System.out.println("Invocation returned");
        return rval;
    }
}

但是您的your通知是一个void方法,而调用方没有得到任何信息,并看到一个null。建议应是:

代码语言:javascript
复制
@Around("action()")
public Object logWarn(ProceedingJoinPoint jp) { 
    Object ret;
    System.out.println("AroundAdvice -> LogAspectImpl ");   
    try {
        ret = jp.proceed(); // store the return value of the advised method
    } catch (Throwable e) {
        e.printStackTrace();
    }
    System.out.println("AroundAdvice -> LogAspectImpl ");
    return ret;  // and pass it back to caller
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36148330

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档