spring aop@pointcut和@before产生illegalargumentexception:error at::0 formal unbound in pointcut

dced5bon  于 2021-07-13  发布在  Java
关注(0)|答案(2)|浏览(345)

我正在做一个springboot项目,包括登录和帐户。我正在努力 @Pointcut 所有控制器方法调用并验证登录信息,以及 @Before 确保会话存在的切入点。因此,代码:

@Aspect
@Component
public class AuthAspect {
    Logger logger = LoggerFactory.getLogger(AuthAspect.class);

    @Pointcut("execution(* show.xianwu.game.frisbeescorer.controller.*.*(..))")
    public void validateLogin(JoinPoint joinPoint) {
        // check the login information
    }

    @Before("validateLogin()")
    public void validateSession(JoinPoint joinPoint) {
        // check the session
    }
}

然而,这会产生 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'projectingArgumentResolverBeanPostProcessor' defined in class path resource [org/springframework/data/web/config/ProjectingArgumentResolverRegistrar.class]: BeanPostProcessor before instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration': Initialization of bean failed; nested exception is java.lang.IllegalArgumentException: error at ::0 formal unbound in pointcut .
删除 validateSession() 以及 @Before 使 @Pointcut 工作。我怎样才能解决这个问题?

4xy9mtcn

4xy9mtcn1#

问题是你定义了一个 JoinPoint 切入点中的参数。它只属于使用切入点的advice方法,而不属于切入点本身。不管怎样,您都不会在那里使用它,因为切入点永远不会被执行,方法只是一个由 @Poinctut 注解。所以你想要的是:

@Pointcut("execution(* show.xianwu.game.frisbeescorer.controller.*.*(..))")
public void validateLogin() {
    // check the login information
}

除此之外(与你的问题无关) .*.* 是非常具体的,并且只匹配一个类中正好在包中的方法 show.xianwu.game.frisbeescorer.controller . 如果还希望在子包中包含类,请使用 .. 相反,在本例中是语法 show.xianwu.game.frisbeescorer.controller..* .

qnzebej0

qnzebej02#

由于您正在从事基于springboot的项目,我建议您使用spring安全特性或其他授权和身份验证框架,如shiro。
如果你无论如何都不想用它们,你可以用 @ModelAttributes 在超类中,在调用任何控制器方法之前调用方法。

@Controller
public class ExampleController extends BaseController {...}
public class BaseController {
    @ModelAttribute
    public void invokeBefore(HttpServletRequest request,
                        HttpServletResponse response) {
         // Check the auth info (e.g., Authorization header) of the request.
    }
}

另外,根据我的经验,直接使用 @Pointcut 在springboot应用程序中。请改用自定义的Spring注解。

相关问题