Wie kann ein JPA-Repository (Spring Data) instrumentiert / beraten werden?
Ich bemühe mich nicht, ein jpa-Repository für Frühjahrsdaten zu erstellen. Ziel ist es, alle Nichtvoid
public-Methoden in einem bestimmten Repository, die mit einer benutzerdefinierten Anmerkung (in diesem Beispiel ResourceNotFound) versehen sind, und Auslösen einer Ausnahme, wenn der Rückgabewert entweder @ inull
oder eine leere Sammlung.
@Repository
@ResourceNotFound
@Transactional(readOnly = true)
public interface CityRepository extends JpaRepository<City, Long>, JpaSpecificationExecutor<City> { … }
Der folgende Rat ist, alle öffentlichen Methoden der Implementierungen der Schnittstelle mit @ zu verbinde@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;
}
DaspublicMethodInsideAClassMarkedWithResourceNotFound(…)
-Methode funktioniert, wenn der Pointcut wie folgt angegeben ist:
@Pointcut("execution(public * package.CityRepository+.*(..))")
Allerdings ist die@ResourceNotFound
Annotation wird nicht abgeholt. Dies kann daran liegen, dass die zugrunde liegende Klasse der Repository-Schnittstelle ein (Proxy-) @ isSimpleJpaRepository
, die diese bestimmte Anmerkung nicht hat.
Gibt es eine Möglichkeit, @ResourceNotFound an die Implementierung weiterzugeben?
- update -
Die Frage wurde geändert, um die Tatsache widerzuspiegeln, dass der Hinweis (um) nur für Repositorys mit einer benutzerdefinierten Anmerkung gelten sollte.