Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用于派生查询的Spring jpa拦截器_Java_Hibernate_Spring Boot_Jpa_Interceptor - Fatal编程技术网

Java 用于派生查询的Spring jpa拦截器

Java 用于派生查询的Spring jpa拦截器,java,hibernate,spring-boot,jpa,interceptor,Java,Hibernate,Spring Boot,Jpa,Interceptor,我想在执行之前拦截spring jpa派生的查询。我尝试了EmptyInterceptor和StatementInspector,但它们正在拦截用@query注释的查询 我推荐net.ttddyy:datasource代理: implementation 'net.ttddyy:datasource-proxy:1.5.1' 以下是后处理器和拦截器: @Component @Slf4j public class DatasourceProxyBeanPostProcessor implemen

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

我推荐net.ttddyy:datasource代理:

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();
    }

  }
}

有关更多信息:

请描述您试图解决的初始问题好吗?我有多个测试/开发模式,我想截取查询并从props读取模式,并使用相应的模式更新查询。不要。。。通过
hibernate.default\u schema
属性指定要使用的架构。您可以将spring配置文件与特定的
应用程序-
.properties`文件一起使用来设置。不要试图弄乱拦截器。使用默认模式,您只能指定一个模式,我有多个模式用于单个环境。