Spring AOP: - 在joinPoint中将parameterNames设为null

时间:2016-07-23 08:32:06

标签: java web-services aop spring-aop

LoggingAspect.java

@Around("allGenericAppServiceImplMethods()")
public Object LoggingAdvice(ProceedingJoinPoint joinPoint)throws Throwable{

MethodSignature signature = (MethodSignature)joinPoint.getSignature();
String[] parameterNames = signature.getParameterNames();

Object[] arguments = joinPoint.getArgs();

我将parameterNames视为null。如何获取parameterNames?

1 个答案:

答案 0 :(得分:1)

我只是在简单的AspectJ中检查过,并且我从未使用AspectJ 1.8.6获得null的参数名称。也许你使用的是旧版本,需要升级到当前版本(1.8.9)。如果使用相应的调试信息编译了相关的类文件,则会正确显示参数名称。但即使调试信息被剥离或者您正在访问JDK方法的参数名称,至少AspectJ会吐出arg0arg1等名称。

更新:纯粹的AspectJ或Spring应用程序中使用的AspectJ LTW中不存在此问题,仅在具有JDK动态代理的基于代理的Spring AOP中存在。我可以通过GitHub上的某个地方克隆一个小样本项目来重现这个问题。

如果您是针对接口进行编程的解决方案是强制使用代理的CGLIB用法,即使这里的默认值是JDK代理。

所以如果您的配置看起来像这样......

<aop:aspectj-autoproxy/>

...只需将其更改为:

<aop:aspectj-autoproxy/>
<aop:config proxy-target-class="true">
    <!-- other beans defined here... -->
</aop:config>

然后再试一次,享受吧。 : - )