2014-05-23 58 views
0

我有一個用Jersey框架編寫的REST端點。我想創建一個AspectJ切入點,捕獲任何澤西GET/POST來檢查參數。對於小服務程序很容易:如何使用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,..)

但你需要建立spec在每個端點基礎上綁定args()子句 - 而使用thisJoinPoint.getArgs()將適用於任何事情。

+0

此方法有效。對不起,由於缺乏業力,無法贊成。 – sergeSF

+0

我實際上做了一些不同的事情:用調試器遍歷澤西島,發現它使用:HttpServletRequest.getQueryString(),getPath(),getRequestURL()getRequestURI。我已經有了大部分規則,所以添加剩下的很快。 – sergeSF