I'm failing in my effort to advice a spring data jpa repository. The goal is to instrument (around) all non-void
public methods in a particular repository annotated with a custom annotation (ResourceNotFound in this example) and throw an exception when the return value is either null
or an empty collection.
@Repository
@ResourceNotFound
@Transactional(readOnly = true)
public interface CityRepository extends JpaRepository<City, Long>, JpaSpecificationExecutor<City> { … }
The following advice is to wire all public methods of the implementations of the interface annotated with @ResourceNotFound
.
@Pointcut("within(com.digitalmisfits.spring.aop.annotation.ResourceNotFound *)")
public void beanAnnotatedWithResourceNotFound() {}
@Pointcut("execution(public * *(..))")
public void publicMethod() {}
@Around("beanAnnotatedWithResourceNotFound() && publicMethod()")
public Object publicMethodInsideAClassMarkedWithResourceNotFound(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("publicMethodInsideAClassMarkedWithResourceNotFound " + pjp.getTarget().toString());;
Object retVal = pjp.proceed();
if(((MethodSignature) pjp.getSignature()).getReturnType() != Void.TYPE && isObjectEmpty(retVal))
throw new RuntimeException("isObjectEmpty == true");
return retVal;
}
The publicMethodInsideAClassMarkedWithResourceNotFound(…)
method works when the pointcut isspecified as:
@Pointcut("execution(public * package.CityRepository+.*(..))")
However, the @ResourceNotFound
annotation is not being picked up. This might be due to the fact that the underlying class of the repository interface is a (proxied) SimpleJpaRepository
which does not have that particular annotation.
Is there a way to propagate @ResourceNotFound to the implementation?
-- update --
Changed the question to reflect the fact that the advice (around) only should apply to repositories with a custom annotation.