【问题标题】:implementing aop..java.lang.IllegalArgumentException: error at ::0 formal unbound in pointcut实现 aop..java.lang.IllegalArgumentException: ::0 切入点中的正式未绑定错误
【发布时间】:2015-04-13 19:44:10
【问题描述】:

我对 Spring AOP 还很陌生。试图在我的项目中实现 AOP。当我运行以下代码时,我收到此错误。非常感谢您的回复。

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:203)
    at org.springframework.aop.aspectj.AspectJExpressionPointcut.checkReadyToMatch(AspectJExpressionPointcut.java:189)
    at org.springframework.aop.aspectj.AspectJExpressionPointcut.getClassFilter(AspectJExpressionPointcut.java:167)
    at org.springframework.aop.support.AopUtils.canApply(AopUtils.java:208)
    at org.springframework.aop.support.AopUtils.canApply(AopUtils.java:262)
    at org.springframework.aop.support.AopUtils.findAdvisorsThatCanApply(AopUtils.java:294)
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Authenticator {
    boolean byPassAuthentication() default false;
}
@Aspect
public class PointcutDefinition {   
    @Pointcut("within(com.test.services..*)")
    public void authenticator() {}
}
@Aspect
public class AccountLoggingAspect {
    @Before(value = "com.test.aop.PointcutDefinition.authenticator() && @annotation(auth)")
    public void authenticatorlogging(Authenticator auth) {
        System.out("test");
    }
}
@Transactional(propagation=Propagation.REQUIRES_NEW)
@Aspect
public class AspectAuditor {
    @Pointcut("within(com.test..*)")
    public void auditPtCut() {}

    @Before(value = "auditPtCut() && @annotation(log)")
    public void beforeMethod(JoinPoint jp, AuditLog log) {
        if (log.enable())
            Audit.startTask(jp.getSignature().getName());
    }
}
<aop:aspectj-autoproxy />
<bean id="loggingAspect" 
    class="com.test.aop.AccountLoggingAspect">
</bean>
    <bean id="loggingAspectAuditor" 
    class="com.test.aop.AspectAuditor">
</bean>

现在将此代码添加到 xml..现在得到不同的错误

<aop:aspectj-autoproxy />

<bean id="loggingAspect" 
    class="com.test.aop.AccountLoggingAspect">
</bean>
    <bean id="loggingAspectAuditor" 
    class="com.test.aop.AspectAuditor">
</bean>

<aop:config>
    <aop:advisor pointcut="com.test.aop.PointcutDefinition()" advice-ref="tx-advice"/>
</aop:config>

<tx:advice id="tx-advice" transaction-manager="transactionManager">
  <tx:attributes>
    <tx:method name="*" propagation="REQUIRED"/>
  </tx:attributes>
</tx:advice>
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.cache.annotation.AnnotationCacheOperationSource#0': Initialization of bean failed; nested exception is java.lang.IllegalArgumentException: error can't bind type name 'com.test.aop'
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:529)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:293)

【问题讨论】:

    标签: java spring annotations aspectj spring-aop


    【解决方案1】:

    也许你想改变这个

    <aop:advisor pointcut="com.test.aop.PointcutDefinition()" advice-ref="tx-advice"/>
    

    到那个

    <aop:advisor pointcut="com.test.aop.PointcutDefinition.authenticator()" advice-ref="tx-advice"/>
    

    这应该可以修复语法错误。

    关于在 Spring AOP 中将切面或建议设为事务性,我不知道是否可能,因为我不是 Spring 用户,另请参阅 my answer here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多