Spring AOP применяется ко всем методам, которые не являются окончательными

У меня есть следующий аспект...

@Aspect
@Component
public class RestrictAspect {

    protected static final Logger logger = LoggerFactory.getLogger(RestrictAspect.class);

    @Pointcut(value = "execution(public * *(..))")
    public void allMethods() {
    }

    @Around("allMethods() && @annotation(restrict)")
    public Object checkAuthorization(ProceedingJoinPoint pjp, Restrict restrict) throws Throwable {
        if (pjp != null && restrict != null && restrict.toRole() >= 0) {

            // get the session info -> then the users
            SessionInformation si = (SessionInformation) FacesContext.getCurrentInstance()
                    .getExternalContext()
                    .getSessionMap()
                    .get(XxxConstants.SESSION_SESSIONINFO);

            if (si == null || si.getUser() == null) {
                final String msg = "No authenticated user found.";
                logger.warn("Throwing InvalidAccessException: {}", msg);
                throw new InvalidAccessException(msg);
            }

            final User user = si.getUser();

            if (!user.isAccountAdmin()) {
                final String msg = "User is not an administrator.";
                logger.warn("Throwing InvalidAccessException: {}", msg);
                throw new InvalidAccessException(msg);
            }

            if (AdminUserRoles.hasRightsTo(user.getRole(), restrict.toRole())) {
                return pjp.proceed();
            } else {
                final String msg = "User does not have access to " + getRoleName(restrict.toRole(), new StringLanguage(MESSAGES, Locale.getDefault())) + "(" + restrict.toRole() + ")";
                logger.warn("Throwing InvalidAccessException: {}", msg);
                throw new InvalidAccessException(msg);
            }
        }
        final String msg = "Unable to grant access.";
        logger.warn("Throwing InvalidAccessException: {}", msg);
        throw new InvalidAccessException(msg);
    }
}

Проблема в том, что он пытается применить аспект к моим последним методам в моих классах и выдает следующие предупреждения:

07 Apr 2019 02:47:11  INFO o.s.a.f.CglibAopProxy:266 [[email protected] @ 1] - Final method [protected final javax.servlet.http.HttpServletRequest net.xxxx.beans.XxxBean.getHttpServletRequest()] cannot get proxied via CGLIB: Calls to this method will NOT be routed to the target instance and might lead to NPEs against uninitialized fields in the proxy instance.
07 Apr 2019 02:47:11  INFO o.s.a.f.CglibAopProxy:266 [[email protected] @ 1] - Final method [public final java.lang.String net.xxxx.beans.XxxBean.getTimeZone()] cannot get proxied via CGLIB: Calls to this method will NOT be routed to the target instance and might lead to NPEs against uninitialized fields in the proxy instance.
07 Apr 2019 02:47:11  INFO o.s.a.f.CglibAopProxy:266 [[email protected] @ 1] - Final method [protected final void net.zzz.beans.XxxBean.log(java.lang.String)] cannot get proxied via CGLIB: Calls to this method will NOT be routed to the target instance and might lead to NPEs against uninitialized fields in the proxy instance.

Все ошибки возникают из-за ряда конечных методов, определенных в базовом классе, к которому применяется Аспект. Есть ли способ написать мой PointCut/execution(), чтобы он не пытался применить это к окончательным методам, чтобы удалить мои ошибки и очистить мои журналы?

Спасибо!

0
0
991
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

То, что вы видите, это не ошибки, а только предупреждения. Тем не менее, имеет смысл быть более точным с вашим pointcut, как вы предложили:

@Pointcut(value = "execution(public !final * *(..))")
public void nonFinalPublicMethods() {}

Кстати, если бы вы переключились с Spring AOP на AspectJ, вы также могли бы сплести окончательные методы, потому что AspectJ не полагается на динамические прокси.

Другие вопросы по теме