nested exception is java.lang.IllegalArgumentException: Pointcut is not well-formed: expecting 'name pattern' at character position 65 错误解析

简介

在尝试使用apo做注解的时候,遇到了这个问题

错误代码如下

    @Pointcut("execution(* com.example.demo.controller.*.*(..))" )
    private void pointcut2() {}
    @Around(value = "pointcut2()")
    public void processAuthority(ProceedingJoinPoint call,MyAnnotation around) throws Throwable {
        System.out.println("ANNOTATION welcome");
//        System.out.println("ANNOTATION 调用方法:"+ around.methodName());
        System.out.println("ANNOTATION 调用类:" + call.getSignature().getDeclaringTypeName());
        System.out.println("ANNOTATION 调用类名" + call.getSignature().getDeclaringType().getSimpleName());
        MethodSignature methodSignature = (MethodSignature) call.getSignature();
        Method method = methodSignature.getMethod();
        MyAnnotation myAnnotation=method.getAnnotation(MyAnnotation.class);
        String name=myAnnotation.methodName();
        System.out.println(name);

如果将processAuthority方法中的MyAnnotation around入参去掉,那么将不会出错,这是为什么呢?

解析

花了一下午,终于找到了原因,入参不匹配,因为采用了@Around方法,同时指定了连接点是pointcut2()方法匹配的连接点

但是该发方法默认是入参一个ProceedingJoinPoint ,而我们多了一个入参around,此时pointcut2()没有对应的入参,应该修改为

@Pointcut("execution(* com.example.demo.controller.*.*(..)) && args(around)", argNames = "around" )
    private void pointcut2(MyAnnotation around) {}

此时再去用这个连接点匹配,就可以通过了。也就是你@Around处理方法,用到了@PointCut匹配连接点,只要多一个参数,就需要在连接点
多写一个入参,这样才会匹配到。

总结

将方法参数绑定到切面上, 那么也应该在切面入口添加对应参数与匹配

参考

https://stackoverflow.com/questions/3832361/spring-3-0-aop-pointcut-is-not-well-formed-expecting-name-pattern-error

posted @ 2022-09-23 10:45  HKnight  阅读(281)  评论(0编辑  收藏  举报