我们使用aspectJ来获取现有应用程序的一些指标。在eclipse中使用AJDT进行构建和编织时,一切都很有效。但在整合环境中。我们使用ant脚本来构建和部署应用程序。
我在ExceptionHandler上遇到问题,确保我们的方面不会抛出异常并破坏应用程序
@Aspect
public class ExceptionHandlerAspect {
/**
* Pointcut
*/
@Pointcut("within(com.xxx.yyy.aop.aspect.*..*)")
public void allMethodInAspectPackage() {}
/**
* Pointcut
*/
@Pointcut("!within(com.xxx.yyy.aop.aspect.ExceptionHandlerAspect)")
public void notInExceptionHandlerAspectClass() {}
/**
* Pointcut
*/
@Pointcut("call(* *(..))")
public void allClassAndMethod() {}
/**
@Around("allClassAndMethod() && allMethodInAspectPackage() && notInExceptionHandlerAspectClass()")
public Object logException(ProceedingJoinPoint joinPoint) throws Throwable{
Object ret = null;
try {
ret = joinPoint.proceed();
}catch (Throwable exception) {
if (joinPoint.getSignature().getDeclaringTypeName().equalsIgnoreCase("org.aspectj.lang.ProceedingJoinPoint")) {
throw exception;
}
this.logException.info("Exception in " + joinPoint.getSignature().getDeclaringTypeName(),exception);
}finally {
return ret;
}
}
}
基本上,我想截取我的方面包中的每个调用,除了ExceptionHandler本身。
ant build看起来像这样:
<iajc inpath="${classes.dir}" destDir="${classes.dir}" fork="true" maxmem="${aspectj.maxmem}" verbose="true" showWeaveInfo="true" debug="true">
<classpath refid="ajclasspath"/>
</iajc>
$ {classes.dir}是javac任务构建应用程序和方面的classes目录
从结果中,
Exception in thread "main" java.lang.NoSuchMethodError: com.xxx.yyy.aop.aspect.ExceptionHandlerAspect.aspectOf()Lcom/xxx/yyy/aop/aspect/ExceptionHandlerAspect;
at com.xxx.yyy.aop.aspect.ecs.AspectBaseEcs.inspectLoginInfo(AspectBaseEcs.java:65)
at com.xxx.yyy.app.es.security.Security.loadApplications(Security.java:172)
at com.xxx.yyy.app.es.gui.VSDlgLogin.loadSecurity(VSDlgLogin.java:346)
at com.xx.yyy.app.es.ApplicationSuite.start(ApplicationSuite.java:839)
at com.xxx.yyy.app.es.ApplicationSuite.main(ApplicationSuite.java:501)
看起来ExceptionHandler没有编织!!!
我希望有人可以帮助我; - )
答案 0 :(得分:5)
基本包名称相同:com.xxx.aop
,我们用于方面的基类名称相同。所以加载了2 com.xxx.aop.AspectBase.class
。
由于我们在Ant构建文件中使用了一个标志来启用编译时编织是/否,我们的AspectBase.class
之一没有编织而另一个编织。
答案 1 :(得分:1)
我有类似的问题
java.lang.NoSuchMethodError: ....aspectOf()...
我正在使用Spring 3.1.2 + Maven 3.0.4 + Tomcat 7.0.29,而且当我启动Tomcat时会发生这种情况。
我不知道为什么会这样。我正在使用Spring Tool Suit IDE,但是当我从命令行执行mvn clean install
时(不在IDE中)它会以某种方式得到修复,这可能对某人有帮助。
答案 2 :(得分:0)
看起来您忘记声明方面路径。你所有的任务都是编译而不是编织。这导致了java.lang.NoSuchMethodError
下面的示例演示如何使用iajc任务进行编织:
<iajc outjar="demo.jar">
<sourceroots>
<pathelement location=”src” />
<pathelement location=".." />
</sourceroots>
<aspectpath>
<pathelement location="org.springframework.aspects-3.0.0.RC1.jar" />
</aspectpath>
</iajc>
我希望这有帮助!
答案 3 :(得分:0)
当我使用Spring Boot时遇到了这个异常,但是我对AspectJ的配置是以“旧方式”完成的。
如果您使用的是Spring Boot,请确保在pom.xml / build.gradle中只有一个依赖项 org.springframework.boot:spring-boot-starter-aop 。 然后,您不需要任何其他@Configuration方面的内容,只需执行以下操作即可:
@Aspect
@Component
public class LogEntityChangesAspect {
@Autowired
private ChangeLogDao changeLogDao;