2012-01-14 4 views
6

getParameterNames() için boş dönen: çıkartılan detaylar OfAspectJ'yi MethodSignature şöyle bu nedenle hedef yöntemin ayrıntıları temelinde çeşitli hesaplamalar yapar ve boy bu peşin ayıklar var

@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(); 
} 

, tüm beklenen yansıtmak her zaman null değerini döndüren parameterNames dışındaki bilgiler. Aşağıdaki imzaya göre {accountDetails} iadesini beklerim. Ne eksik olduğumu bilen var mı, yoksa bu bir böcek mi? Benim için

Long createAccount(RequestAccountDetails accountDetails); 
+1

Görünümden, parametre adlarını almanın güvenilir bir yolu yoktur (derleme zamanında ayarlanan seçeneklerden bağımsız). Java yansımasını kullanarak metod parametre adı alabilir miyim? (Http://stackoverflow.com/questions/2237803/can-i-obtain-method-parameter-name-using-java-reflection) ve [Bir yolu var mı? Java'da yöntem parametrelerinin isimlerini elde etmek için?] (http://stackoverflow.com/questions/381502/is-there-a-way-to-obtain-names-of-method-parameters-in-java). Bu yüzden buradaki oyunda olabileceğinden şüpheleniyorum. –

cevap

1

eser: Burada

ben karşı çalışıyorum hedef yönteminin imzası

@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(); 

    } 
} 

çıkışı: paramName: accountDetails

Ben validateParams imzasını değişti: public Object validateParams(ProceedingJoinPoint joinPoint) throws Throwable, createAccount() bir Uzun döndürür. Aksi halde şu hatayı alırım: applying to join point that doesnt return void: {0}

+1

Teşekkürler Fred! Analizlerimden, paramNames'in mevcut olduğu belirli ortamlar/JVM konfigürasyonları var gibi görünüyor, ama şimdi biraz zaman geçti ve belirli detayları hatırlayamıyor. Geri dönüş değerine işaret ettiğin için, soruyu benim kodumdan uyarladım ve bazı bitleri dışarıda bırakmış olabilirdim. –