2012-01-14 30 views
6

Tôi đã một khía cạnh mà không tính toán khác nhau dựa trên các chi tiết phương pháp của đối phương, và do đó chiết xuất những trả trước như sau:AspectJ MethodSignature trở về null cho 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(); 
} 

Trong số chi tiết trích xuất, tất cả phản ánh mong đợi thông tin ngoại trừ parameterNames luôn trả về null. Tôi hy vọng nó sẽ trả lại {accountDetails} theo chữ ký bên dưới. Có ai biết những gì tôi có thể bị mất, hoặc là một lỗi này?

Dưới đây là chữ ký của phương pháp mục tiêu tôi đang làm việc chống lại:

Long createAccount(RequestAccountDetails accountDetails); 
+1

Từ giao diện của nó, không có cách nào đáng tin cậy (độc lập với các tùy chọn được đặt tại thời gian biên dịch) khi nhận tên thông số. Xem [Tôi có thể lấy tên tham số phương thức bằng cách sử dụng phản chiếu Java không?] (Http://stackoverflow.com/questions/2237803/can-i-obtain-method-parameter-name-using-java-reflection) và [Có cách nào không để lấy tên của các tham số phương thức trong Java?] (http://stackoverflow.com/questions/381502/is-there-a-way-to-obtain-names-of-method-parameters-in-java). Vì vậy, tôi nghi ngờ đây có thể là những gì đang chơi ở đây. –

Trả lời

1

công trình cho tôi:

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

    } 
} 

đầu ra: paramName: accountDetails

Tôi đã thay đổi chữ ký của validateParams để: public Object validateParams(ProceedingJoinPoint joinPoint) throws ThrowablecreateAccount() trả về Dài. Nếu không, tôi nhận được lỗi: applying to join point that doesnt return void: {0}

+1

Cảm ơn Fred! Từ các phân tích của tôi, nó xuất hiện có một số môi trường nhất định/cấu hình JVM nơi paramNames có sẵn, nhưng nó đã được một thời gian trở lại bây giờ và không thể nhớ lại các chi tiết cụ thể. Cảm ơn bạn đã chỉ ra giá trị trả lại, tôi đã điều chỉnh câu hỏi từ mã của mình và có thể đã bỏ sót một số bit. –

Các vấn đề liên quan