使用AspectJ

时间:2015-05-18 13:07:49

标签: java rest jersey aspectj

我有几个API,它们保留了url(path param)中的参数“feature”。避免在每个方法端点中检索它(例如)

@GET
public void findAll(@PathParam("feature") String feature);

我正在尝试使用AspectJ实现AOP。

以下是Aspect的实现

@Aspect
public class FeatureAOP {
@Pointcut("execution(* x.y.z.rest.ModifiersFacadeWrapper.*(..)) && args(feature)")
    public void pointCut(String feature) {
}

@Before("x.y.z.rest.aop.FeatureAOP.pointCut(feature)")
public void parseParams(JoinPoint jp, String feature) {
    Object[] x = jp.getArgs();
    System.out.println("Feature: " + feature);
}

}

上面的方法为我提供了Aspect类中“feature”的值,但是如果我将方法 findAll 更改为以下签名,则它不起作用。

 @GET
 public void findAll();

我理解的是,在解析参数后将控件转移到Aspect,并从方法定义中将其删除失败。

这样做,因此我需要使用其签名中的参数定义所有方法端点。我想知道是否有一种方法可以在Aspect类中获得 PathParams,而无需使用指定的参数定义我的方法。

1 个答案:

答案 0 :(得分:0)

我认为你可以通过将已解析的参数放在一个全局可访问的数据结构中来实现(例如,Singleton具有某种Map或Set),但是 我不推荐这种方法。我不知道为什么你不喜欢在方法签名中使用所有参数,但这是宣布休息服务的预期方式,例如。

@GET
@Path("{feature}")
@Produces("text/plain")
public String getFeature(@PathParam("feature") String feature) {
    return feature;
}

这样你就不必编写任何用于检索params的代码,你正在使用的其余库(无论是Jersey还是其他库)都会为你做一切。