Как использовать / консультировать репозиторий Spring Data (JPA)?
Я терплю неудачу в своих усилиях по консультированию весеннего хранилища данных jpa. Цель состоит в том, чтобыvoid
открытые методы в определенном репозитории, аннотированные пользовательской аннотацией (ResourceNotFound в этом примере), и выдают исключение, когда возвращаемое значение либоnull
или пустая коллекция.
@Repository
@ResourceNotFound
@Transactional(readOnly = true)
public interface CityRepository extends JpaRepository<City, Long>, JpaSpecificationExecutor<City> { … }
Следующий совет состоит в том, чтобы связать все открытые методы реализаций интерфейса с аннотацией@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;
}
publicMethodInsideAClassMarkedWithResourceNotFound(…)
Метод работает, когда pointcut задан как:
@Pointcut("execution(public * package.CityRepository+.*(..))")
Тем не менее@ResourceNotFound
аннотация не подбирается. Это может быть связано с тем, что базовый класс интерфейса репозитория является (прокси)SimpleJpaRepository
который не имеет этой конкретной аннотации.
Есть ли способ распространения @ResourceNotFound для реализации?
-- Обновить --
Изменен вопрос, чтобы отразить тот факт, что рекомендации (около) должны применяться только к репозиториям с пользовательской аннотацией.