복붙노트

[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. ==============================

    1.당신은 단순히 pointcut의 주석 앞에 @를 놓치고 있습니다.

    당신은 단순히 pointcut의 주석 앞에 @를 놓치고 있습니다.

    @Around("anyPublicMethod() && @annotation(timePerformance)")
                                  ^
    
  2. ==============================

    2.애스펙트 클래스에서이 구성을 사용하여 문제를 해결합니다.

    애스펙트 클래스에서이 구성을 사용하여 문제를 해결합니다.

    @Around("execution(* *(..)) && @annotation(timePerformance)")
    public Object  timePerformance(ProceedingJoinPoint pjp, TimePerformance timePerformance) throws Throwable 
    

    그러나 문제는 지금, 양상이 실행되지 않습니다.

  3. from https://stackoverflow.com/questions/21279716/error-at-0-cant-find-referenced-pointcut-annotation by cc-by-sa and MIT license