Java 用于派生查询的Spring jpa拦截器
我想在执行之前拦截spring jpa派生的查询。我尝试了EmptyInterceptor和StatementInspector,但它们正在拦截用@query注释的查询 我推荐net.ttddyy:datasource代理: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
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`文件一起使用来设置。不要试图弄乱拦截器。使用默认模式,您只能指定一个模式,我有多个模式用于单个环境。