首页 > 解决方案 > 派生查询的 Spring jpa 拦截器

问题描述

我想在执行之前拦截 spring jpa 派生查询。我尝试使用 EmptyInterceptor 和 StatementInspector,但它们正在拦截使用 @query 注释的查询。

标签: javahibernatespring-bootjpainterceptor

解决方案


我推荐 net.ttddyy:datasource-proxy:

implementation 'net.ttddyy:datasource-proxy:1.5.1'

这是后处理器和拦截器:

@Component
@Slf4j
public class DatasourceProxyBeanPostProcessor implements BeanPostProcessor {

  @Override
  public Object postProcessAfterInitialization(Object bean, String beanName) {
    if (bean instanceof DataSource && !(bean instanceof ProxyDataSource)) {
      log.info("DataSource bean has been found: " + bean);
      final ProxyFactory factory = new ProxyFactory(bean);
      factory.setProxyTargetClass(true);
      factory.addAdvice(new ProxyDataSourceInterceptor((DataSource) bean));
      return factory.getProxy();
    }
    return bean;
  }

 @Override
 public Object postProcessBeforeInitialization(Object bean, String beanName) {
   return bean;
 }

 private static class ProxyDataSourceInterceptor implements MethodInterceptor {
   private final DataSource dataSource;

    public ProxyDataSourceInterceptor(final DataSource dataSource) {
     this.dataSource = ProxyDataSourceBuilder.create(dataSource)
      .name("MyServiceDS")
      .logQueryBySlf4j(SLF4JLogLevel.DEBUG)
      .multiline()
      .build();
    }

    @Override
    public Object invoke(final MethodInvocation invocation) throws Throwable {
      final Method proxyMethod = ReflectionUtils.findMethod(this.dataSource.getClass(),
          invocation.getMethod().getName());
      if (proxyMethod != null) {
        return proxyMethod.invoke(this.dataSource, invocation.getArguments());
      }
      return invocation.proceed();
    }

  }
}

更多信息:https ://github.com/ttddyy/datasource-proxy


推荐阅读