Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

AOP : java.lang.IllegalArgumentException: error at ::0 can't find referenced pointcut

Tags:

spring-aop

I am new to AOP. I got some problem like this.

package org.suman.Aspect;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class LoginAspect {
    //@Before("execution(public String getName())")
    //@Before("execution(public String org.suman.Model.Triangle.getName())")
    //@Before("execution(* get*())")
    //@Before("execution(* get*(..))")
    //@Before("execution(* org.suman.Model.*.get*())")

    //@Before("execution(* get*())&& within(org.suman.Model.Circle)")
    @Before("execution(* get*())&& allCircle()")
    //@Before("allGetters() && allCircle()")
    public void LoginAdvice()
    {
        System.out.println("Advice run.. getMethod is called");
    }

    @Before("execution(* get*())")
    //@Before("allGetters()")
    public void SecondAdvice()
    {
        System.out.println("this is a second Advice");
    }
    @Pointcut("execution(* get*())")
    public void allGetters(){}

    //@Pointcut("execution (* * org.suman.Model.Circle.*(..))")
    @Pointcut("within(org.suman.Model.Circle)")
    public void allCircle(){}

} 

when using pointcut, the method allGetters() to LoginAdvice method, if I use @Before("execution(* get*())") then no error but if I use @Before("allGetters()") then gives error

java.lang.IllegalArgumentException: error at ::0 can't find referenced pointcut allGetters

if I use @Before("execution(* get*())&& within(org.suman.Model.Circle)") instead of method name it works.

My xml like this:

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">
    <!-- <context:annotation-config /> -->
    <aop:aspectj-autoproxy />

    <bean name="triangle" class="org.suman.Model.Triangle">
        <property name="name" value="Triangle Name"></property>
    </bean>
    <bean name="circle" class="org.suman.Model.Circle">
        <property name="name" value="Circle name"></property>
    </bean>
    <bean name="shapeService" class="org.suman.Services.ShapeService"
        autowire="byName"></bean>
    <bean name="loginAspect" class="org.suman.Aspect.LoginAspect"></bean>

</beans>

Please solve the problem with pointcut by which it takes method

like image 968
user1379705 Avatar asked May 07 '12 13:05

user1379705


2 Answers

Use aspectjweaver and aspectjrt versions 1.8.10

like image 120
Atul Gupta Avatar answered Oct 19 '22 12:10

Atul Gupta


Encountered the same error in the different use case.

enter image description here

UseCase : Tried to call a pointcut which is present in different aspect class.

logServicePointCut1() pointcut present in LogService

package com.opensource.kms;
@Aspect
@Component
public class LogService {
    
    @Pointcut("execution(* com.opensource.kms.AccountService.my*(..))")
    public void logServicePointCut1() {
    }
}

Try to call in SecurityService

@Aspect
@Component
public class SecurityService {

    @Before("logServicePointCut1()")  /*Need to give fully Qualified name*/
    public void verifyUserBeforeSecurityService() {
        System.out.println("verifyUserBeforeSecurityService");
    }
}

Solution: Need to pass fully qualifed name com.opensource.kms.LogService.logServicePointCut1()

Hope this would helpful for someone!!

like image 23
Kms Avatar answered Oct 19 '22 11:10

Kms