Не удается получить реальные имена параметров в Spring Boot Aspect - PullRequest
0 голосов
/ 19 января 2019

Я пытаюсь добавить операторы журнала перед динамическим выполнением каждого метода с использованием Aspectj.

Код:

@Component
@Aspect
public class MethodLogger {
    DiagnosticLogger logger = DiagnosticLogger.getLogger(getClass());

    @Before("execution(* com.xyz..*.*(..))")
    public void beforeMethod(JoinPoint joinPoint) throws Throwable {
        System.out.println("Class******" + joinPoint.getTarget().getClass().getName());
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        System.out.println("Method******" + signature.getName());

        // append args
        Object[] args = joinPoint.getArgs();

        String[] parameterNames = signature.getParameterNames();
        if (parameterNames != null) {
            for (int i = 0; i < parameterNames.length; i++) {
                System.out.println("parameterNames******" + parameterNames[i] + ":" + args[i]);
            }
        }
    }

}

Вывод:

Class******com.xyz.security.web.UserController
Method******forgotPassword
parameterNames******userEmail:naresh@xyz.com
Class******com.xyz.security.service.impl.UserServiceImpl
Method******forgotPassword
parameterNames******userEmail:naresh@xyz.com
Class******com.sun.proxy.$Proxy436
Method******findByUserEmail

Я могу получить на уровне контроллера и обслуживания.Но когда дело доходит до метода Spring Data JPA Repository, его невозможно распечатать.Как получить имена параметров на уровне репозитория?

1 Ответ

0 голосов
/ 19 января 2019

Вот пример того, что я сделал.

При добавлении знака + также перехватываются классы, которые реализуют мой репозиторий или любой другой из моих интерфейсов в com.example. **.

@Slf4j
@Component
@Aspect
public class MethodLogger {

    @Before("execution(* com.example.*..*+.*(..))")
    public void beforeMethod(JoinPoint joinPoint) throws Throwable {
        log.info("Class******" + joinPoint.getTarget().getClass().getName());

        for (Class<?> theinterface: joinPoint.getTarget().getClass().getInterfaces()) {
            log.info("Interfaces******" + theinterface.getName());
        }

        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        log.info("Method******" + signature.getName());

        Object[] args = joinPoint.getArgs();

        String[] parameterNames = signature.getParameterNames();
        if (parameterNames != null) {
            for (int i = 0; i < parameterNames.length; i++) {
                log.info("parameterNames******" + parameterNames[i] + ":" + args[i]);
            }
        }
    }

}

Имена параметров также регистрируются:

Class******com.sun.proxy.$Proxy87
Interfaces******com.example.demoaspectmethodlogging.control.EmployeeRepository
Interfaces******org.springframework.data.repository.Repository
Interfaces******org.springframework.transaction.interceptor.TransactionalProxy
Interfaces******org.springframework.aop.framework.Advised
Interfaces******org.springframework.core.DecoratingProxy
Method******findByName
parameterNames******name:Simon
...