问题
I am trying to use @AfterReturning of AspectJ to get return value of a specific function call.
Not sure why @AfterReturning not working for the following method call.
Though I am trying to use @AfterReturning on 2 methods of same class, 1 works when another didn't. Only difference between two methods are number of arguments, where @AfterReturning working for method with one argument.
Working
@AfterReturning(
pointcut = "execution(org.springframework.http.ResponseEntity com.service.QueryGenerationService.method1(*))",
returning = "retVal"
)
public void interceptMethod1(ResponseEntity retVal) {
System.out.println(retVal+"---->");
}
Not working
@AfterReturning(
pointcut = "execution(com.entity.ReportGenerationExportResult com.service.QueryGenerationService.method2(com.entity.ReportGenerationServiceRequest, com.entity.querybuilder.QueryBuilderResponse))",
returning = "retVal"
)
public void interceptMethod2(ReportGenerationExportResult retVal) {
System.out.println(retVal);
}
Generic specification also not working(for 2 method parameters)
@AfterReturning(
pointcut = "execution(* com.service.QueryGenerationService.method2(*, *))",
returning = "retVal"
)
public void test1(Object retVal){
System.out.println(retVal);
}
Service class where 2 methods exist
@Service
public class QueryGenerationService {
public ResponseEntity method1(
ReportGenerationServiceRequest request
) throws Exception
{
//some logic
ReportGenerationExportResult exportResult = method2(request, queryBuilderResponse);
return toResponseEntity(exportResult);
}
public ReportGenerationExportResult method2(
ReportGenerationServiceRequest originalRequest,
QueryBuilderResponse queryBuilderResponse
) throws Exception
{
//some logic
return reportGenerationExportResult;
}
}
How can I successfully get the return value of second method?
回答1:
This one is a classic: You are looking for the answer in the wrong place. Not the pointcut is the problem, your application class in combination with Spring AOP's proxy-based nature is:
As the Spring manual clearly explains in chapter Understanding AOP Proxies, Spring AOP does not work for self-invocation.
Your method2
is called directly from method1
, not from outside, thus the method call goes to the original object, not to the AOP proxy. Consequently, no aspect will fire there.
If you need aspects working with self-invocation you need to switch from Spring AOP to full-featured ASpectJ as described here.
回答2:
issue is in your regular expression.. I think this link can help you..
Your code for both the methods should be like...
//interceptMethod2
@AfterReturning(pointcut = "execution(* com.service.QueryGenerationService.method1(com.entity.ReportGenerationServiceRequest))", returning = "retVal")
public void interceptMethod2(ReportGenerationExportResult retVal) {
System.out.println(retVal);
}
//generic method which execute for all the methods in class QueryGenerationService
@AfterReturning(
pointcut = "execution(* com.service.QueryGenerationService.*(..))"
, returning = "retVal")
public void test1(Object retVal){
System.out.println(retVal);
}
来源:https://stackoverflow.com/questions/57427286/afterreturning-annotation-not-working-for-specific-method-structure