如何使用AspectJ捕获任何Jersey POST / GET请求?

时间:2014-05-23 22:37:14

标签: jersey aspectj

我有一个用Jersey框架编写的REST端点。我想创建一个AspectJ切入点,捕获任何Jersey GET / POST来检查params。对于servlet来说很简单:

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

这里是Jersey 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;
  }
}

1 个答案:

答案 0 :(得分:0)

如果可以的话,我很想使用execution()而不是call(),但下面的签名可以使用。如果您的端点由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()将适用于任何事情。