2010-06-23 607 views
8

我有一个带有很多方法的服务接口,所有方法都带一个Request对象并返回一个Response对象。所有的请求对象都有一个共同的祖先,所有的响应对象都有一个不同的共同祖先(它有一个成功标志和一个消息字段)。Spring aop切入点表达式访问方法返回类型

现在我想要检查权限等方面,执行服务调用,并返回一个失败代码的Response对象,如果有任何失败。问题是:我需要知道创建什么类型的Response对象。是否有一个切入点表达式使我可以访问返回类型?也许这样的事情?

@Around(value = "execution(public *" 
    + " com.mycompany.MyService+.*(..))" 
    + " && args(request)" 
    + " && returning(returnType)" // something like this would be nice 

, argNames = "request,returnType") 
public Object handleServiceCall(final ProceedingJoinPoint pjp, 
    final Request request, 
    final Class<? extends Response> returnType){ ... } 
+0

所以,你想建议几个具有相同方面的方法,有时需要产生并返回响应对象而不调用服务,并且该响应对象必须是服务方法的正确子类型? – 2010-06-23 09:52:46

+0

是的,这正是我想要的 – 2010-06-23 11:34:06

回答

6

JoinPoint的Javadoc提到了getSignature()方法,它的返回类型Signature有子接口MethodSignature你可以尝试投射,其方法有getReturnType(),这可能是你正在寻找的。

+0

我知道这一点。这是我准备去的方式,如果没有更好的解决方案存在,但我更喜欢切入点表达式。 – 2010-06-23 10:08:14

0

你可以做环绕通知方法内,办理入住手续(handleServiceCall()你的情况)

Object actuals = pjp.proceed(); 
if(actuals instanceof MyResponse){ 
//TO:DO: Your code here 
} 
+0

我知道,但这不会帮助,因为我不会总是执行pjp.proceed()。如果我的方面决定用户没有执行服务调用的权利,它将直接创建响应对象而无需继续。 – 2010-06-23 09:27:19

+0

不要在切入点表达式中使用'*'作为'ret-type-pattern'。而是使用您想拦截的方法的实际返回类型。 – chedine 2010-06-23 09:46:09

+0

不好:我想拦截很多不同的返回类型,我想知道我拥有哪一个。 – 2010-06-23 10:07:18

相关问题