2012-01-14 16 views
6

I aspekt, który ma różne obliczenia na podstawie danych METODY docelowego, a więc Ekstrakty z góry, jak następuje:AspectJ MethodSignature powrocie null getParameterNames()

@Around("execution(* com.xyz.service.AccountService.*(..))") 
public void validateParams(ProceedingJoinPoint joinPoint) throws Throwable { 
    final MethodSignature signature = (MethodSignature) joinPoint.getSignature(); 

    final String methodName = signature.getName(); 
    final String[] parameterNames = signature.getParameterNames(); 
    final Object[] arguments = joinPoint.getArgs(); 
    ... 
    ... 
    ... 
    joinPoint.proceed(); 
} 

wyekstrahowanego szczegółów wszystkie odzwierciedlają oczekiwany info z wyjątkiem parametruName, które zawsze zwraca wartość null. Spodziewam się, że zwróci {accountDetails} zgodnie z podpisem poniżej. Czy ktokolwiek wie, czego mi brakuje, czy jest to błąd?

Oto podpis metody docelowej pracuję przeciw:

Long createAccount(RequestAccountDetails accountDetails); 
+1

Z jego wyglądu nie ma niezawodnego sposobu (niezależnie od opcji ustawionych podczas kompilacji) pobierania nazw parametrów. Zobacz [Czy mogę uzyskać nazwę parametru metody za pomocą Java Reflect?] (Http://stackoverflow.com/questions/2237803/can-i-obtain-method-parameter-name-using-java-reflection) i [Czy istnieje sposób uzyskać nazwy parametrów metod w Javie?] (http://stackoverflow.com/questions/381502/is-there-a-way-to-obtain-names-of-method-parameters-in-java). Podejrzewam, że to może być to, co tu się dzieje. –

Odpowiedz

1

utworów dla mnie:

@Aspect 
public class MyAspect { 

    @Around("execution(* *(..)) && !within(MyAspect)") 
    public Object validateParams(ProceedingJoinPoint joinPoint) throws Throwable { 
     final MethodSignature signature = (MethodSignature) joinPoint.getSignature(); 

     final String[] parameterNames = signature.getParameterNames(); 
     for (String string : parameterNames) { 
      System.out.println("paramName: " + string); 
     } 

     return joinPoint.proceed(); 

    } 
} 

wyjściowa: paramName: accountDetails

zmieniłem podpis validateParams do: public Object validateParams(ProceedingJoinPoint joinPoint) throws Throwable ponieważ createAccount() zwraca wartość Long. W przeciwnym razie dostaję błąd: applying to join point that doesnt return void: {0}

+1

Dzięki Fred! Z moich analiz wynika, że ​​istnieją pewne konfiguracje środowisk/JVM, w których parametry paramNames są dostępne, ale minęło już trochę czasu i nie można przywołać konkretnych szczegółów. Dzięki za wskazanie wartości zwrotu, dostosowałem pytanie z mojego kodu i mogłem pominąć pewne bity. –

Powiązane problemy