2012-01-14 6 views
6

he un aspecto que hace varios cálculos en base a los detalles del método de destino, y por lo tanto extractos estos adelantado como sigue:AspectJ MethodSignature volver nulo para 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(); 
} 

de los detalles extraídos, todos reflejan la espera info excepto parameterNames que siempre devuelve null. Esperaría que devuelva {accountDetails} según la firma a continuación. ¿Alguien sabría lo que me puede estar perdiendo, o es un error?

Aquí está la firma del método de destino estoy trabajando en contra:

Long createAccount(RequestAccountDetails accountDetails); 
+1

Por lo que parece, no hay una manera confiable (independientemente de las opciones establecidas en tiempo de compilación) de obtener los nombres de los parámetros. Consulte [¿Puedo obtener el nombre del parámetro del método usando la reflexión de Java?] (Http://stackoverflow.com/questions/2237803/can-i-obtain-method-parameter-name-using-java-reflection) y [¿Hay alguna manera? para obtener los nombres de los parámetros del método en Java?] (http://stackoverflow.com/questions/381502/is-there-a-way-to-obtain-names-of-method-parameters-in-java). Entonces sospecho que esto puede ser lo que está en juego aquí. –

Respuesta

1

funciona para mí:

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

    } 
} 

de salida: paramName: accountDetails

me han cambiado la firma de validateParams a: public Object validateParams(ProceedingJoinPoint joinPoint) throws Throwable porque createAccount() devuelve un Largo. De lo contrario, aparece el error: applying to join point that doesnt return void: {0}

+1

Gracias Fred! A partir de mis análisis, parece que hay ciertos entornos/configuraciones JVM donde paramNames están disponibles, pero hace un tiempo que no puede recordar los detalles específicos. Gracias por señalar el valor de retorno, adapté la pregunta de mi código y podría haber omitido algunos bits. –