我正在学习Spring。我只是编写了一些非常简单的代码来尝试一下,我不明白为什么在我的测试代码中调用ControllerImpl的登录方法之后,"re"是空的。
我只知道Spring是如何工作的,也许这就是我无法理解失败的原因。
也许您可以在AopTest.java.I使用最新的STS作为我的IDE来运行这个测试。
我使用STS来调试我的代码,但是Spring使用动态代理,所以我看不到详细信息。
您将看到这样的“结果=空”:
单击此处查看我的测试输出。
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);
}
}发布于 2016-03-22 09:02:09
我将分两部分回答:
我使用STS来调试我的代码,但是Spring使用动态代理,所以我看不到细节。首先,您可以从Spring框架加载源代码,并在它的内部类中执行一步,直到它到达您的类为止,但是您可以只在建议和建议的方法中添加断点。
然后,当控制器的返回值中没有一个为null时,控制器返回null的实际原因。在看到输出后,我假设login方法确实返回了一个null字符串值,可能是success。但你的建议没能传回给打电话的人。
春季参考手册指出(强调我的):
invoke()方法应该返回调用的结果:连接点的返回值。
甚至举了一个例子:
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。建议应是:
@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
}https://stackoverflow.com/questions/36148330
复制相似问题