2013-06-27 5 views
0

JAX-RS @POST로 표시된 인터페이스의 메소드를 가로 채려고합니다. 내 Pointcut은 모든 비 인터페이스 메서드와 @ POST-Annotation이 호출 된 메서드에서 직접 작동하는 경우에 작동합니다.AspectJ JAX-RS에 주석 처리 된 인터페이스 메소드의 pointcut 호출

인터페이스 방법은 요격 :

@POST 
Response postToConnector(@Context CallContext callContext, String contentStream) throws Exception; 

포인트 컷은 방법과 일치하는 :

@Pointcut("call(@(javax.ws.rs.DELETE || javax.ws.rs.GET || javax.ws.rs.HEAD || javax.ws.rs.OPTIONS || " 
    + "javax.ws.rs.POST || javax.ws.rs.PUT) public * org.myapp..webapi..*(..))") 
public void anyPublicWebApiPointcut() 
{ 
... 
} 

인터페이스는 패키지 com.myapp.social.webapi.v1 내부 및 경우에도입니다 I 메소드를 public으로 변경한다. AspectJ는 호출을 인터셉트하지 않는다.

내 Pointcut에서 변경할 사항이 있습니까? 어떻게 작동시킬 수 있습니까?

+0

나는 이것이 오래된 것으로 알고 있지만 여전히 답이없는 것으로 열거되어 있습니다. 받아 들일 것이고 내 대답을 상향 조정하는 것이 적절하다고 생각하십니까? 감사. – kriegaex

답변

0

포인트 컷의 의미는 이름에서 알 수 있듯이 특정 메소드/생성자에 대한 호출을 차단합니다. 이 기능을 사용하려면 발신자 (예 : 전화가 걸려있는 코드 조각)가 사용자가 제어 할 수 있어야합니다. 즉, 코드가 짜여져 있어야합니다. 따라서 예를 들어 당신은 org.myapp..webapi..* 클래스들을 엮어서 그곳에서 호출이 발급되었으므로 작동 할 것입니다. 그것이 작동하지 않는다는 것은 POST 호출이 짠 코드 외부의 어딘가에서 왔다고 가정합니다. JRE 또는 타사 라이브러리

따라서 org.myapp..webapi..*이 제어 할 수있는 경우, 즉 aspect 코드를 넣을 수 있다면 execution() pointcut을 사용해야합니다. call()과 대조적으로, 호출 수신자, 즉 메소드가 정의 된 코드로 짜여져 있으며 호출되는 곳이 아닙니다. 이렇게하면 응용 프로그램이나 타사 또는 JRE 코드에서 온 모든 메소드 실행을 가로 챌 수 있습니다. 이는 리플렉션에 의해 트리거되는 메소드 실행에서도 작동합니다.

call()execution()은 기본적으로 서로 다른 의미를 가지고있어 배우고 이해하는 데 많은 도움이됩니다. 대략적으로, 가능할 때마다, 즉 피 호출 수신인이 당신을 위해 쓸모가있을 때마다 execution()을 사용해야합니다. call()은 호출 수신자를 사용해야하며 호출 수신자를 사용할 수없는 경우에만 사용할 수 있습니다. call()은 어떤 이유로 인해 joinpoint 컨텍스트를 기반으로 결정을 내려야하는 경우에도 의미가 있습니다. 어떤 조건에 따라 원래의 메소드를 호출하거나 호출하지 않기로 결정한 조언.