Spring AOP error at ::0 formal unbound in pointcut

Spring4.2.4 使用XML配置方式实现AOP切入时出现错误:error at ::0 formal unbound in pointcut

测试代码如下:

 

public interface IUserService {

    public void login(String name, String pwd);

    public void setAdministratorUserName(String name);
}

public interface IStockService {

    public long getStockLevel(String level);

    public void applyDiscounts(Date date, BigDecimal bigDecimal);
}

public class DefaultUserService implements IUserService {

    private String administratorUserName;
    public DefaultUserService() {
    }

    public void login() {
    }

    public void login(String name) {
        SecurityContext.setUserName(name);
    }

    public void login(String name, String pwd) {
        SecurityContext.setUserName(name);
    }

    public String getAdministratorUserName() {
        return this.administratorUserName;
    }

    public void setAdministratorUserName(String name) {
        this.administratorUserName = name;
    }
}

public class DefaultStockService implements IStockService {

    public long getStockLevel(String level) {
        try {
            if(level == null) {
                    throw new IOException("stock level not null");
            }
        } catch (IOException e) {
                e.printStackTrace();
        }
        return 1;
    }

    public void applyDiscounts(Date date, BigDecimal bigDecimal) {
        System.out.println(date + " >> " + bigDecimal.byteValue());
    }
}
public class SecurityContext {

    private static SecurityContextHolder holder = new SecurityContextHolder();

    public static String getUserName() {
        return holder.getUserName();
    }

    public static void setUserName(String userName) {
        holder.setUserName(userName);
    }

    private static class SecurityContextHolder {

        private ThreadLocal<String> currentUser = new ThreadLocal<String>();
        public String getUserName() {
            return currentUser.get();
        }

        public void setUserName(String userName) {
            currentUser.set(userName);
        }
    }
}

 

public class AspectBean {

    public void logCall(Joinpoint joinpoint) {
        System.out.println("--------------------");
        System.out.println(joinpoint);
    }

    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("conf/ch6/aspectBean.xml");
        IUserService userService = (DefaultUserService) ctx.getBean("userService");
        IStockService stockServic = (DefaultStockService) ctx.getBean("stockService");
        userService.login("admin", "****");
        stockServic.getStockLevel("a");
    }
}

 

<?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:p="http://www.springframework.org/schema/p"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="
           http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/aop
           http://www.springframework.org/schema/aop/spring-aop.xsd ">

    <bean id="userService" class="com.ycx.ch6.section3.service.DefaultUserService"/>
    <bean id="stockService" class="com.ycx.ch6.section3.service.DefaultStockService"/>
    <bean id="aspectBean" class="com.ycx.ch6.section3.AspectBean"/>

    <aop:config proxy-target-class="true">
        <aop:pointcut id="serviceCall" expression="execution(* com.ycx.ch6.section3.service.*Service.*(..))"/>
        <!-- <aop:pointcut id="serviceCall" expression="execution(* com.ycx.ch6.section3.*Service.*.*(..))"/> -->
        <!-- <aop:pointcut id="serviceCall" expression="execution(void com.ycx.ch6.section3.*Service.*.*(..))"/> -->
        <aop:aspect id="firstAspect" ref="aspectBean">
            <aop:before method="logCall" pointcut-ref="serviceCall"/>
        </aop:aspect>
    </aop:config>
</beans>

 
错误日志:

警告: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userService' defined in class path resource [conf/ch6/aspectBean.xml]: BeanPostProcessor before instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.aop.aspectj.AspectJPointcutAdvisor#0': Bean instantiation via constructor failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.aop.aspectj.AspectJPointcutAdvisor]: Constructor threw exception; nested exception is java.lang.IllegalArgumentException: error at ::0 formal unbound in pointcut 

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userService' defined in class path resource [conf/ch6/aspectBean.xml]: BeanPostProcessor before instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.aop.aspectj.AspectJPointcutAdvisor#0': Bean instantiation via constructor failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.aop.aspectj.AspectJPointcutAdvisor]: Constructor threw exception; nested exception is java.lang.IllegalArgumentException: error at ::0 formal unbound in pointcut 

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:478)

at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)

at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)

at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)

at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)

at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772)

at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839)

at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538)

at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)

at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)

at com.ycx.ch6.section3.AspectBean.main(AspectBean.java:25)

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.aop.aspectj.AspectJPointcutAdvisor#0': Bean instantiation via constructor failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.aop.aspectj.AspectJPointcutAdvisor]: Constructor threw exception; nested exception is java.lang.IllegalArgumentException: error at ::0 formal unbound in pointcut 

at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:275)

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1143)

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1046)

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:510)

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)

at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)

at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)

at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)

at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)

at org.springframework.aop.framework.autoproxy.BeanFactoryAdvisorRetrievalHelper.findAdvisorBeans(BeanFactoryAdvisorRetrievalHelper.java:92)

at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findCandidateAdvisors(AbstractAdvisorAutoProxyCreator.java:101)

at org.springframework.aop.aspectj.autoproxy.AspectJAwareAdvisorAutoProxyCreator.shouldSkip(AspectJAwareAdvisorAutoProxyCreator.java:103)

at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessBeforeInstantiation(AbstractAutoProxyCreator.java:248)

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInstantiation(AbstractAutowireCapableBeanFactory.java:988)

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.resolveBeforeInstantiation(AbstractAutowireCapableBeanFactory.java:959)

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:472)

... 10 more

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.aop.aspectj.AspectJPointcutAdvisor]: Constructor threw exception; nested exception is java.lang.IllegalArgumentException: error at ::0 formal unbound in pointcut 

at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:163)

at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:122)

at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:267)

... 25 more

Caused by: java.lang.IllegalArgumentException: error at ::0 formal unbound in pointcut 

at org.aspectj.weaver.tools.PointcutParser.parsePointcutExpression(PointcutParser.java:301)

at org.springframework.aop.aspectj.AspectJExpressionPointcut.buildPointcutExpression(AspectJExpressionPointcut.java:207)

at org.springframework.aop.aspectj.AspectJExpressionPointcut.checkReadyToMatch(AspectJExpressionPointcut.java:193)

at org.springframework.aop.aspectj.AspectJExpressionPointcut.getMethodMatcher(AspectJExpressionPointcut.java:176)

at org.springframework.aop.aspectj.AbstractAspectJAdvice.buildSafePointcut(AbstractAspectJAdvice.java:187)

at org.springframework.aop.aspectj.AspectJPointcutAdvisor.<init>(AspectJPointcutAdvisor.java:51)

at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)

at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)

at java.lang.reflect.Constructor.newInstance(Constructor.java:526)

at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:147)

 

 注:经过debug Spring使用annotation注解时使用的是aopalliance.jar中的Joinpoint接口声明

org.aopalliance.intercept.Joinpoint;

而xml配置时是用的aspectjrt.jar中的Joinpoint接口声明

org.aspectj.lang.JoinPoint;

 

修改后的代码:

 

public class AspectBean {
    // import org.aopalliance.intercept.Joinpoint;   // wrong interface import
    import org.aspectj.lang.JoinPoint                // right interface import
    public void logCall(org.aspectj.lang.JoinPoint joinpoint) {
        System.out.println("--------------------");
        System.out.println(joinpoint);
    }

    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("conf/ch6/aspectBean.xml");
        IUserService userService = (DefaultUserService) ctx.getBean("userService");
        IStockService stockServic = (DefaultStockService) ctx.getBean("stockService");
        userService.login("admin", "****");
        stockServic.getStockLevel("a");
    }
}
 

 

猜你喜欢

转载自zlj214.iteye.com/blog/2375155