¿Cómo instrumentar / aconsejar un repositorio Spring Data (JPA)?
Estoy fallando en mi esfuerzo por aconsejar un repositorio jpa de datos de primavera. El objetivo es instrumentar (alrededor) a todos los que novoid
métodos públicos en un repositorio particular anotados con una anotación personalizada (ResourceNotFound en este ejemplo) y arrojan una excepción cuando el valor de retorno esnull
o una colección vacía.
@Repository
@ResourceNotFound
@Transactional(readOnly = true)
public interface CityRepository extends JpaRepository<City, Long>, JpaSpecificationExecutor<City> { … }
El siguiente consejo es conectar todos los métodos públicos de las implementaciones de la interfaz anotada con@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;
}
lospublicMethodInsideAClassMarkedWithResourceNotFound(…)
El método funciona cuando el punto de corte se especifica como:
@Pointcut("execution(public * package.CityRepository+.*(..))")
sin embargo, el@ResourceNotFound
la anotación no se está recogiendo. Esto podría deberse al hecho de que la clase subyacente de la interfaz del repositorio es un (proxy)SimpleJpaRepository
que no tiene esa anotación particular.
¿Hay alguna manera de propagar @ResourceNotFound a la implementación?
- actualización -
Se modificó la pregunta para reflejar el hecho de que el consejo (alrededor) solo debería aplicarse a los repositorios con una anotación personalizada.