java—如何根据传递给方法的参数从方面执行@before

kg7wmglp  于 2021-07-15  发布在  Java
关注(0)|答案(1)|浏览(429)

我已经实现了一个方面,它检查一个用户是否是高级用户,并根据这一点我可以抛出一个匹配的异常。我会检查一个方法的自定义注解。我将从securitycontext中获取用户,并执行以下操作:

@Before(value = "@annotation(com.selfcast.annotation.RequiresBasic)")
public void requirePremiumForAction() {
    var talent = Optional.of((JwtAuthentication) SecurityContextHolder.getContext()
            .getAuthentication())
            .map(authUtil::getCredentials)
            .map(x -> userService.whoAmTalent(x.getEmail()))
            .orElseThrow(NoSuchTalent::new);

        if (
                paymentLaunchService.hasPaymentLaunchedInCountry(talent.getCountry().getId()) &&
                !talent.getAccountKind().equals(AccountKind.BASIC) &&
                !talent.getAccountKind().equals(AccountKind.FREEMIUM)
        ) {
            throw new ActionRequiresPremium();
        }
}

当我想根据一个方法接收的参数来执行它时,我该如何继续?我需要根据对象的id获取对象,检查该对象的属性,然后才返回actionrequirespremium异常。像这样:

@RequiresBasic
public Object doSomething(String Id){

}

这有可能吗?据我所知不是。然而,像@after这样的用法似乎毫无意义。如果这是不可能的,有什么好的选择?

wydwbb8l

wydwbb8l1#

你可以用 JoinPoint 作为你建议中的论据。当你有了它,你就可以使用 getArgs 方法获取被调用方法的参数。

@Before(value = "@annotation(com.selfcast.annotation.RequiresBasic)")
public void requirePremiumForAction(JoinPoint jp) {
    var args = jp.getArgs(); // Now do your thing with the arguments as needed
    ... Remainder ommitted
}

相关问题