java - 派生查询的 Spring jpa 拦截器
问题描述
我想在执行之前拦截 spring jpa 派生查询。我尝试使用 EmptyInterceptor 和 StatementInspector,但它们正在拦截使用 @query 注释的查询。
解决方案
我推荐 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();
}
}
}
推荐阅读
- php - #还有其他人在第 50 行看到意外的“{”吗?或其余代码
- r - 使用 read_csv 从 readr 直接读取 zip 文件会产生奇怪的结果
- r - 基础 R 条形图 x 轴倾斜
- ios - 如何将字符串值从一个类传递给同一个视图控制器上的另一个类
- c - 了解 K&R 的 getint()(第 5 章:指针和数组,练习 1)?
- javascript - 在导出函数中调用导出函数
- javascript - 在 JavaScript 中链接 EventEmitters 并在emitter.on() 之前调用emitter.emit()
- jquery - jQuery UI 的贪婪 droppable 无法按预期工作
- jms - JMS 临时队列 - 回复未返回给客户端
- windows - Google Kubernetes Engine (GKE) 中的 Windows Server 容器