[SPRING] :: 0에서 오류가 참조 된 pointcut 주석을 찾을 수 없습니다.
SPRING:: 0에서 오류가 참조 된 pointcut 주석을 찾을 수 없습니다.
특정 메소드의 실행 시간을 모니터하는 측면을 작성하려고합니다. 테스트를 실행하려고하면이 오류가 발생합니다.
Caused by: java.lang.IllegalArgumentException: error at ::0 can't find referenced pointcut annotation
at org.aspectj.weaver.tools.PointcutParser.parsePointcutExpression(PointcutParser.java:301)
at org.springframework.aop.aspectj.AspectJExpressionPointcut.buildPointcutExpression(AspectJExpressionPointcut.java:207)
ApplicationContext가 로딩 될 때.
주석을 다음과 같이 정의합니다.
@Retention(RetentionPolicy.RUNTIME)
@Target(
{
ElementType.METHOD,
ElementType.TYPE
})
public @interface TimePerformance {
}
그리고 이것이 aspect 코드입니다 :
@Aspect
public class MonitorImpl{
private static final Log LOG = LogFactory.getLog(MonitorImpl.class);
@Pointcut(value="execution(public * *(..))")
public void anyPublicMethod() { }
@Around("anyPublicMethod() && annotation(timePerformance)")
public Object timePerformance(ProceedingJoinPoint pjp,TimePerformance timePerformance) throws Throwable {
if (LOG.isInfoEnabled()) {
LOG.info("AOP - Before executing "+pjp.getSignature());
}
Long startTime = System.currentTimeMillis();
Object result = pjp.proceed();
Long stopTime = System.currentTimeMillis();
LOG.info("MONITOR TIME_EXECUTION "+pjp.getSignature()+" : "+(stopTime-startTime));
if (LOG.isInfoEnabled()) {
LOG.info("AOP - After executing "+pjp.getSignature());
}
return result;
}
}
구성은 다음과 같습니다.
<!-- AOP support -->
<bean id='stateAspectImpl' class='eu.genetwister.snpaware.ui.aspect.StateAspectImpl' />
<bean id='monitorImpl' class='eu.genetwister.snpaware.monitor.MonitorImpl' />
<aop:aspectj-autoproxy>
<aop:include name='stateAspectImpl' />
<aop:include name='monitorImpl' />
</aop:aspectj-autoproxy>
방금 많은 질문을 살펴 보았지만 대부분의 경우 솔루션으로 aspectj 버전 1.7을 사용합니다. 나는 다음을 사용하고있다 :
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.7.0</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.7.0</version>
</dependency>
다른 솔루션은 메서드 시그니처의 변수 이름을 가리 킵니다. 그러나 여기서 볼 수 있듯이 오류는 없습니다.
누구에게 문제가 있는지에 대한 생각이 있습니까?
감사
해결법
-
==============================
1.당신은 단순히 pointcut의 주석 앞에 @를 놓치고 있습니다.
당신은 단순히 pointcut의 주석 앞에 @를 놓치고 있습니다.
@Around("anyPublicMethod() && @annotation(timePerformance)") ^
-
==============================
2.애스펙트 클래스에서이 구성을 사용하여 문제를 해결합니다.
애스펙트 클래스에서이 구성을 사용하여 문제를 해결합니다.
@Around("execution(* *(..)) && @annotation(timePerformance)") public Object timePerformance(ProceedingJoinPoint pjp, TimePerformance timePerformance) throws Throwable
그러나 문제는 지금, 양상이 실행되지 않습니다.
from https://stackoverflow.com/questions/21279716/error-at-0-cant-find-referenced-pointcut-annotation by cc-by-sa and MIT license