2014-05-23 1 views
0

Jersey 프레임 워크로 작성된 REST 엔드 포인트가 있습니다. params를 검사하기 위해 어떤 저지 GET/POST를 잡는 AspectJ pointcut을 만들고 싶습니다. 서블릿의 경우는 쉬웠다 : 여기 AspectJ로 Jersey POST/GET 요청을 잡는 방법은 무엇입니까?

"call(public java.lang.String javax.servlet.ServletRequest.getParameter(java.lang.String))" 

는 뉴저지 REST 엔드 포인트의 코드입니다 :

import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import javax.ws.rs.PathParam; 
import javax.ws.rs.Produces; 
import javax.xml.bind.annotation.XmlRootElement; 

@Path("/test/{username}") 
    public class JerseyTest { 

    @XmlRootElement 
     public static class BigTest { 
     public String name; 
    } 

    @GET 
    @Produces("text/plain") 
    public String getHello(BigTest test, @PathParam("username") String username) { 
    return "hello " + username; 
    } 
} 

답변

0
나는 실행()가 아니라()를 호출 할 수 있다면,하지만를 사용하도록 유혹 할 것

아래의 서명은 둘 중 하나에서 작동합니다. 엔드 포인트가 GET/POST에 의해 확인하는 경우 :

before(): execution(@GET * *(..)) || execution(@POST * *(..)) { Object[] args = thisJoinPoint.getArgs(); ... do what you want with the args }

당신은 그들에 @Path와 유형의 메소드에 일치를 좁힐 수 :

execution(@GET * *(..)) && @within(Path)

당신이 특정 매개 변수를 원하는 경우 :

before(BigTest test): execution(@GET * *(..)) && args(test,..)

하지만 다음 사양을 작성해야합니다. 끝점마다 args() 절을 바인딩하는 반면 thisJoinPoint.getArgs()를 사용하면 아무 문제가 없습니다.

+0

이 방법이 효과적입니다. 죄송합니다, 카르마의 부족으로 upvote 수 없습니다. – sergeSF

+0

저는 실제로 뭔가 다른 것을했습니다 : Jersey를 통해 디버거를 밟아서 HttpServletRequest.getQueryString(), getPath(), getRequestURL() getRequestURI를 사용한다는 것을 알았습니다. 이미 대부분의 규칙이 있었기 때문에 나머지 규칙을 추가하는 것이 매우 빠릅니다. – sergeSF

관련 문제