尽管OP严重依赖于AspectJ解决方案,但目前的问题并不直接表明解决方案应限于AspectJ。因此,我想提供一种非AspectJ的方式来建议Spring
Data JPA存储库。它基于将自定义添加
Interceptor到准系统Spring AOP代理拦截器链中。
首先,配置您的自定义
RepositoryFactoryBean,例如
@Configuration@EnableJpaRepositories(repositoryFactoryBeanClass = CustomRepositoryFactoryBean.class)public class ConfigJpaRepositories {}接下来,实施
CustomRepositoryFactoryBean添加自己
RepositoryProxyPostProcessor的
JpaRepositoryFactory
class CustomRepositoryFactoryBean<R extends JpaRepository<T, I>, T , I extends Serializable> extends JpaRepositoryFactoryBean<R, T, I> { protected RepositoryFactorySupport createRepositoryFactory(EntityManager em) { RepositoryFactorySupport factory = super.createRepositoryFactory(em); factory.addRepositoryProxyPostProcessor(new ResourceNotFoundProxyPostProcessor()); return factory; }}您的
RepositoryProxyPostProcessor实现应将您添加
MethodInterceptor到
ProxyFactory特定存储库(检查
RepositoryInformation):
class ResourceNotFoundProxyPostProcessor implements RepositoryProxyPostProcessor { @Override public void postProcess(ProxyFactory factory, RepositoryInformation repositoryInformation) { if (repositoryInformation.getRepositoryInterface().equals(CityRepository.class)) factory.addAdvice(new ResourceNotFoundMethodInterceptor()); }}并且在您
MethodInterceptor(BTW是的子接口
org.aopalliance.aop.Advice,所以仍然是一个建议:))中,您具有AspectJ
@Around建议的全部功能:
class ResourceNotFoundMethodInterceptor implements MethodInterceptor { @Override public Object invoke(MethodInvocation invocation) throws Throwable { Method method = invocation.getMethod(); ResourceNotFound resourceNotFound = method.getAnnotation(ResourceNotFound.class); //... Object result = invocation.proceed(); //... return result; }}


