AOP:error at ::0 formal unbound in pointcut

@Pointcut("execution(public * net.parim.spark.portal.*.controller..*.*(..))")
public void canVisitHome() {}


@Before("canVisitHome()")
public void doBefore() {
        
}

写拦截器解决时,之前没有传递过参数,aop很轻松的就实现了,如今 想想在切点方法里面传递自己参数,却发现项目跑不起来了报错error at ::0 formal unbound in pointcut,解决办法是在注解声明即可以
@Before("canVisitHome() && args(request,userToken)")
public void doBefore(HttpServletRequest request,UserToken userToken) {

    Site site = portalCommonService.getSite(request, userToken);
    if(!(site.getAnonymousAccess() && applicationProperties.getLoginWithCurrentSite())){//如果不允许匿名访问返回401
        throw new UnauthenticatedException();
    }
}

注意:追加参数时只能拦截到参数对应的方法,如果参数不应则无法通过切面,即拦截不生效。
想要继续生效,可采用切面动态传参技术
@Before("canVisitHome() && args(request,userToken,..)")
public void doBefore(HttpServletRequest request,UserToken userToken){
if(null == userToken.getCurrentSite()){
Site site = portalCommonService.getSite(request, userToken);
if(!(site.getAnonymousAccess() && applicationProperties.getLoginWithCurrentSite())){//如果不允许匿名访问返回401
throw new UnauthenticatedException();
}
}
}
需要注意的是,需要切面的方法参数的顺序要一致,并且以这两个参数开头。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容