2016-12-13 4 views
1

LTW에서 사용하려고하는 pointcut이 있습니다. 나는 각각 다른 매개 변수 목록을 가지고 조언하려고하는 두 가지 방법을 가지고있다. 그러나 둘 다 원하는 공통 매개 변수가 하나뿐입니다.AspectJ 포인트 컷 일치 인수 (args())가 정확히 일치하지 않습니다.

이 메소드 서명은 내가 조언을 할 수 있습니다 : 나는 다음과 같은 포인트 컷/조언을 시도했습니다

public static WorkflowModifierFlags authenticateUser(String username, String password, String ip, boolean webGUI, boolean realAuthentication) 

    public static boolean loginJAAS(HttpServletRequest request, HttpServletResponse response, String username, String password, HttpSession session) 

을하지만 실패입니다; 사용자 이름 변수에 IP 주소가 주입되기도합니다 (예 : 첫 번째 pointcut에서 args()).

@Before("(execution(public static * business.security.service.LoginManagerHelper.authenticateUser(..)) && args(username, ..)) || " 
     + "(execution(public static * webapp.util.LoginManagerAction.loginJAAS(..)) && args(*, *, username, ..))") 
public void setUsername(JoinPoint jp, String username) { 
    // inject the username into the MDC 
    MDCUtils.setUsername(username); 
} 

나는 args() 매개 변수는 실행() 메소드에 관련되어,하지만 때로는 "혼란"되어 나타납니다, 그리고 나에게 대신 사용자 이름의 IP를 제공 것으로 예상했을 것이다.

AspectJ를 잘못 사용하고 있습니까? 아니면 LTW의 버그입니까? 나는 AspectJ 1.6.13을 실행 중이다.

+0

aspectj-user 메일 링리스트에서 Andy Clement가 확인한대로 이것은 AJ 작성자/작성자의 버그입니다. 문제를 추적하기 위해 https://bugs.eclipse.org/bugs/show_bug.cgi?id=509235에 버그가보고되었습니다. –

+0

사이드 노트 : AspectJ 1.8.x로 업그레이드 할 준비가 되셨습니까? Andy는 오래된 1.6.x 버전으로 수정 사항을 백 포팅하지 않을 것입니다. 왜 1.6.13을 사용하는지 궁금합니다. 이 일을하도록 강요하는 이유가 있습니까? – kriegaex

+0

@kriegaex LTW가있는 jb4 컨테이너에서 aspect1 1.8을 사용할 수 없습니다. –

답변

1

AspectJ 1.8.9는 같은 동작을한다. 이에 대한 한 가지 해결책/해결 방법은 각 사례에 대해 다른 pointcut을 사용하여 조언을 두 개로 나눈 다음 코드 중복을 피하기 위해 사용자 이름으로 수행하려는 논리를 위임하는 것입니다. 그것은이 비슷한 보일 것이다

@Before("execution(public static * business.security.service.LoginManagerHelper.authenticateUser(..)) && args(username, ..)") 
public void pointcut1(String username) { 
    doSomethingWithUsername(username); 
} 

@Before("execution(public static * webapp.util.LoginManagerAction.loginJAAS(..)) && args(*, *, username, ..)") 
public void pointcut2(String username) { 
    doSomethingWithUsername(username); 
} 

private void doSomethingWithUsername(String username) { 
    // inject the username into the MDC 
    MDCUtils.setUsername(username); 
} 

나는 항상 각 사용 사례에 대한 그런 식으로 (즉, 포인트 컷 원래 ||와 함께 표현)가 발생 @annotation() 유형의 포인트 컷과 함께하기 때문에를 바인딩을 사용하여 OR-ED의 포인트 컷에 따라 분할 조언 일관되지 않은 바인딩에 대한 오류 메시지가 나타납니다. 공통적 인 기능을 별도의 방법으로 추출하는 사례와 비슷한 해결책에 대한 내 다른 두 가지 답변을 참조하십시오 : answer 1, answer 2.

AspectJ는 @annotation() 유형 pointcuts와 동일한 동작을 보여야한다고 생각합니다. 따라서 오류를보고하지 않고 예상치 못한 일을하는 컴파일러가 AspectJ 컴파일러 자체의 버그라고 생각합니다.

+1

aspectj-users 목록에 게시하고 앤디 클레멘트 (Andy Clement)는 포인트 컷 재 작성 (.aj 구문에서도 발생)에서 버그 일 가능성이 있음을 확인했습니다. https://bugs.eclipse.org/bugs/show_bug.cgi?id=509235에서 버그를 제기했습니다. 그동안 나는 당신이 제안한 것과 똑같이 일을 끝내 었습니다 - 나는 그것이 더 복잡한 코드라고 생각합니다. –

+0

버그 신고서를 제출해 주셔서 감사합니다. 나는 똑같은 일을하려고했고, 나는 다른 일과 너무 바빴다. –