java - Spring AOP :- Getting parameterNames as null in the joinPoint

标签 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?

最佳答案

我刚刚检查了普通的 AspectJ,但在 AspectJ 1.8.6 中,我从未将参数名称设置为 null。也许您使用的是旧版本,需要升级到当前版本 (1.8.9)。如果有问题的类文件是使用相应的调试信息编译的,则参数名称会正确显示。但是,即使删除了调试信息或者您正在访问 JDK 方法的参数名称,至少 AspectJ 会吐出像 arg0arg1 等这样的名称。

更新:该问题在纯AspectJ 或Spring 应用程序中使用的AspectJ LTW 中不存在,仅在使用JDK 动态代理的基于代理的Spring AOP 中存在。我可以使用从 GitHub 某处克隆的一个小示例项目重现该问题。

如果您针对接口(interface)进行编程,解决方案是对代理强制使用 CGLIB,即使这里的默认设置是 JDK 代理也是如此。

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

<aop:aspectj-autoproxy/>

...只需将其更改为:

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

然后重试并享受。 :-)

关于java - Spring AOP :- Getting parameterNames as null in the joinPoint,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38539797/

相关文章:

java - Gradle (java) : test task should use generated . jar 而不是类路径中的 .class 文件

c# - 为什么 Process.Start 在 asp.net web 服务中不起作用?

java - 如何将 AspectJ 加载时编织与 Spring AOP 结合使用?

java - AspectJ 在 Eclipse 中不能正常工作

java - 需要帮助开始创建 GUI/显示变量信息

Java:如何创建从继承类获取对象的 getter 方法?

java - 将文件转换为字节数组并通过 UDP 传输。如何从这个字节数组中获取服务器上的文件名?

c# - 在 Web API 中从存储库级别返回错误的好方法

java - Web 服务的生命周期异常

java - 添加 AOP 建议时 Spring Boot 应用程序上下文被破坏