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.