Como instruir / aconselhar um repositório Spring Data (JPA)?

Estou falhando no meu esforço para aconselhar um repositório jpa de dados do Spring. O objetivo é instrumentar (em torno) todos osvoid métodos públicos em um repositório específico anotado com uma anotação personalizada (ResourceNotFound neste exemplo) e lança uma exceção quando o valor de retorno énull ou uma coleção vazia.

@Repository 
@ResourceNotFound
@Transactional(readOnly = true)
public interface CityRepository extends JpaRepository<City, Long>, JpaSpecificationExecutor<City> { … }

O conselho a seguir é conectar todos os métodos públicos das implementações da interface anotada com@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;
}

opublicMethodInsideAClassMarkedWithResourceNotFound(…) O método funciona quando o pointcut é especificado como:

@Pointcut("execution(public * package.CityRepository+.*(..))")

No entanto, o@ResourceNotFound a anotação não está sendo captada. Isso pode ser devido ao fato de que a classe subjacente da interface do repositório é uma (proxy)SimpleJpaRepository que não possui essa anotação específica.

Existe uma maneira de propagar @ResourceNotFound para a implementação?

- atualização -

A pergunta foi alterada para refletir o fato de que o conselho (ao redor) deve se aplicar apenas a repositórios com uma anotação personalizada.

questionAnswers(5)

yourAnswerToTheQuestion