AspectJ - Как зарегистрировать имя переопределенного метода вместо имени метода суперкласса

Я создал класс регистратора для всех своих репозиториев, сервисов и контроллеров. Я заставляю его регистрировать каждый вызов метода следующим методом:

@Before("execution(* com.mdenis.tno..controller..*(..)) || " + 
        "execution(* com.mdenis.tno..service..*(..)) || " + 
        "execution(* com.mdenis.tno..repository..*(..))")
private void logMethodCallWithParameters(JoinPoint joinPoint)
{
    String arguments = "";

    for (Object argument : Arrays.asList(joinPoint.getArgs()))
    {
        arguments = arguments + argument.toString() + ", ";
    }

    if (arguments.contains(", "))
    {
        arguments = arguments.substring(0, arguments.lastIndexOf(","));
    }

    if (arguments.compareTo("") == 0)
    {
        logger.debug("Method " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName() 
            + " called with no argument");
    }
    else
    {
        logger.debug("Method " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName() 
            + " called with argument(s) " + arguments);
    }
}

Это прекрасно работает, но все мои службы расширяют базовую службу, в которой есть общие методы. Таким образом, вызов метода в PostServiceImpl приводит к следующему оператору журнала:

Method com.mdenis.tno.service.impl.BaseServiceImpl.findAllPaginated returning with result Page 1 of 2 containing com.mdenis.tno.model.Post instances.

Я хотел бы знать, есть ли способ для регистрации имени расширяющего класса (PostServiceImpl) вместо имени суперкласса (BaseServiceImpl).

Спасибо!


person Martin    schedule 20.01.2019    source источник


Ответы (1)


Ты используешь

joinPoint.getTarget().getClass().getCanonicalName()

для имени класса.

person daniu    schedule 20.01.2019
comment
я думаю, вы имеете в виду getTarget().getClass().getCanonicalName() и да, это действительно работает, спасибо! - person Martin; 20.01.2019
comment
Однако у методов JpaRepository есть побочный эффект, они возвращают что-то вроде com.sun.proxy.$Proxy198.save для имени метода. Я полностью понимаю, почему это происходит, учитывая весь прокси-сервер Spring, но есть ли способ обойти это? - person Martin; 20.01.2019
comment
@Мартин, насколько я знаю, не элегантный. Я бы не стал применять аспекты к репозиториям (скорее к вызывающим службам), но помимо этого вам, вероятно, нужно получить объявленные интерфейсы класса и зарегистрировать наиболее конкретный из них, который расширяет тот, на котором активирован аспект. - person daniu; 20.01.2019
comment
Возможно, вы захотите ознакомиться с моим ответом здесь и изучить мой служебный метод unProxy(..). Поможет ли это, если вы интегрируете его в свой аспект и назовете его как unProxy(joinPoint.getTarget()).getClass().getCanonicalName()? Я не пытался, потому что вы не предоставили общий доступ к MCVE, на котором я мог бы его использовать. - person kriegaex; 03.02.2019