8
votes

I have a service interface with many methods, all of which take a Request object and return a Response object. All request objects have a common ancestor and all response objects have a different common ancestor (which has a success flag and a message field).

Now I want to have an around aspect that checks permissions etc, performs the service call and returns a Response object with a failure code if anything fails. The problem is: I need to know what type of Response object to create. Is there a pointcut expression that gives me access to the return type? Something like this, perhaps?

@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){ ... }
2
So you want to advise several methods with the same aspect, which sometimes needs to produce and return the response object without calling the service, and that response object must be of the proper subtype for the service method? - Christian Semrau
yup, that's exactly what I want - Sean Patrick Floyd

2 Answers

6
votes

The Javadoc for JoinPoint mentions a getSignature() method, whose return type Signature has a sub interface MethodSignature you could try casting to, which has a method getReturnType(), which might be what you are looking for.

0
votes

You can do that check inside the around advice method(handleServiceCall() in your case)

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