我正在尝试使用Spring建议参数运行Spring演示程序。在执行下面的代码时,我得到了异常"java.lang.IllegalArgumentException: error at ::0,形式上在切入点中未绑定“。请帮助我理解下面的代码有什么问题。
Performance.java
package com.aop.annotations.example4;
public interface Performance {
public void perform(int performanceNum, String performanceName) throws Exception;
public void buyTicket(int price) throws Exception;
}
CircusPerformance.java
package com.aop.annotations.example4;
public class CircusPerformance implements Performance {
@Override
public void perform(int performanceNum, String performanceName) throws Exception {
System.out.println("Circus Performance number:"+performanceNum+" and Performance name :"+performanceName+" in progress..");
}
@Override
public void buyTicket(int price){
System.out.println("Buy Ticket for Circus performance");
}
}
DancePerformance.java
package com.aop.annotations.example4;
public class DancePerformance implements Performance{
@Override
public void perform(int performanceNum, String performanceName) throws Exception {
System.out.println("Dance Performance number:"+performanceNum+" and Performance name :"+performanceName+" in progress..");
}
@Override
public void buyTicket(int price) throws Exception {
System.out.println("Buy Ticket for Dance performance");
}
}
Audience.java
package com.aop.annotations.example4;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class Audience {
@Pointcut("execution(* com.aop.annotations.example4.Performance.*(..)) && args(int,String)")
public void performance() {
}
@Pointcut("execution(* com.aop.annotations.example4.Performance.*(..)) && args(int)")
public void buyTicket() {
}
@After("buyTicket()")
public void afterTicket(JoinPoint jp, int price) {
System.out.println("Start of method: " + jp.getSignature().getName() + " of Class: "
+ jp.getTarget().getClass().getSimpleName());
System.out.println("Buying Ticket of Price :" + price);
System.out.println("Silencing cell phones");
System.out.println("Taking seats");
}
@Before("performance()")
public void beforePerformance(JoinPoint jp, int performanceNum, String performanceName) {
System.out.println("Start of method: " + jp.getSignature().getName() + " of Class: "
+ jp.getTarget().getClass().getSimpleName());
System.out.println("Performance Number :" + performanceNum + "+ is :" + performanceName);
}
@After("performance()")
public void afterPerformance(JoinPoint jp,int performanceNum, String performanceName) {
System.out.println("End of method: " + jp.getSignature().getName() + " of Class: "
+ jp.getTarget().getClass().getSimpleName());
System.out.println("End of PerformanceName :" + performanceName);
System.out.println("CLAP CLAP CLAP!!!");
}
}
TestAOPMain.java
package com.aop.annotations.example4;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestAOPMain {
public static void main(String args[]) {
try {
ApplicationContext context = new ClassPathXmlApplicationContext("appContext4.xml");
Performance dancePerformance = context.getBean("dance", DancePerformance.class);
dancePerformance.buyTicket(100);
dancePerformance.perform(1,"Bhangra Dance");
dancePerformance.perform(2,"Garba Dance");
dancePerformance.perform(3,"Bharatnatyam Dance");
dancePerformance.perform(4,"Folk Dance");
Performance circusPerformance = (CircusPerformance) context.getBean("circus");
circusPerformance.buyTicket(200);
circusPerformance.perform(1,"Ball Juggling");
circusPerformance.perform(2,"Animal act");
circusPerformance.perform(3,"Rope Jump");
circusPerformance.perform(4,"Magic Show");
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
aopContext4.xml:
<?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:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.aop.annotations.example4" />
<aop:aspectj-autoproxy proxy-target-class="true" />
<bean id = "dance" class="com.aop.annotations.example4.DancePerformance" />
<bean id = "circus" class="com.aop.annotations.example4.CircusPerformance" />
</beans>
异常:
WARNING: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.context.event.internalEventListenerProcessor': Initialization of bean failed; nested exception is java.lang.IllegalArgumentException: error at ::0 formal unbound in pointcut
Error creating bean with name 'org.springframework.context.event.internalEventListenerProcessor': Initialization of bean failed; nested exception is java.lang.IllegalArgumentException: error at ::0 formal unbound in pointcut
发布于 2019-02-16 18:33:53
如果不需要方面的通知中的方法参数值,则不应该使用args()
,而应该在切入点中指定方法签名,如下所示:
@Pointcut("execution(* com.aop.annotations.example4.Performance.*(int, String))")
public void performance() {}
@Pointcut("execution(* com.aop.annotations.example4.Performance.*(int))")
public void buyTicket(int price) {}
只有当您确实需要访问参数时,正如您的代码所暗示的那样,您应该使用args()
,但也需要将参数添加到切入点,而不仅仅是添加到建议中。如果直接在通知中定义切入点,则只需执行一次。单独定义切入点,仅当您想在同一方面的多个建议中重复使用相同的切入点时,IMO才有帮助。无论如何,您要做的是修复您的代码(我没有运行它,只是写了这个“免费”):
@Pointcut("execution(* com.aop.annotations.example4.Performance.*(..)) && args(performanceNum, performanceName)")
public void performance(int performanceNum, String performanceName) {}
@Pointcut("execution(* com.aop.annotations.example4.Performance.*(..)) && args(price)")
public void buyTicket(int price) {}
顺便说一下,错误消息“在切入点中正式解除绑定”意味着您没有通过args()
、this()
、target()
或@target()
正确绑定通知方法签名中的形式参数。或者相反,切入点语法是正确的,但是方法签名是错误的。
https://stackoverflow.com/questions/54278964
复制相似问题