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
Use aspectjweaver and aspectjrt versions 1.8.10
Encountered the same error in the different use case.
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!!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With