Java 如何始终拦截Spring4.x事务

Java 如何始终拦截Spring4.x事务,java,spring,spring-data,Java,Spring,Spring Data,我们使用的是Spring4.x、Hibernate5.x、SpringData1.11,目前我们有一个SQL拦截器,它扩展了org.hiberate.EmptyInterceptor,我们基本上是在web请求开始时使用HibernateInterceptor.setInterceptor手动连接它。我们还有通过Spring任务调度器在后台运行的作业。它们启动自己的事务,而这些事务显然没有连接拦截器。我现在要做的是找到一种方法,在所有情况下拦截Spring的@Transactional 我已经研究

我们使用的是Spring4.x、Hibernate5.x、SpringData1.11,目前我们有一个SQL拦截器,它扩展了
org.hiberate.EmptyInterceptor
,我们基本上是在web请求开始时使用
HibernateInterceptor.setInterceptor
手动连接它。我们还有通过Spring任务调度器在后台运行的作业。它们启动自己的事务,而这些事务显然没有连接拦截器。我现在要做的是找到一种方法,在所有情况下拦截Spring的@Transactional

我已经研究了
TransactionInterceptor
,以及
@TransactionEventListener
,但到目前为止还没有任何一种方法能够发挥作用,很难找出目前认为Spring的最佳实践是什么

因此,我们试图解决的基本问题是,在事务结束时,我们需要知道它是否失败或成功

那么,Spring当前的最佳实践是什么,始终获取提交前/提交后事件,以便我们可以根据需要做出响应

编辑


意识到
@TransactionalEventListener
不起作用,因为我们没有使用Spring事件,所以这只是我对其实际作用的误解。

一种方法是创建一个简单的方面,例如:

@Aspect
@Component
public class AfterTransactionalAspect {

    @After("@annotation(Transactional)")
    public void cleanupAfterTransaction(JoinPoint joinPoint) throws Throwable {  
        // ... Do cleanup work here
    }
另一个好方法(如果您使用的是Spring事件)是使用
@TransactionalEventListener


是否确实正在使用
应用程序EventPublisher
发布事件?你确定你的配置中有
@EnableTransactionManagement
@TransactionalEventListener
是一个公共方法,设置了
TransactionTemplate
,在发布事件发生的方法上使用
@Transactional
吗?

我对TransactionalEventListener做了更多的阅读,我想我误解了。在我们的例子中,我们自己并没有通过Spring发布事件,所以它对我们来说并不真正有效。不过,我们需要在事务结束时做一些清理工作,所以当任何事务结束时,我们都感兴趣。好的,你可以创建一个方面来为你做这件事(比如拦截器),但是你可以使它显式化。请参阅编辑后的答案。谢谢,我试过了,但它似乎不是从我们的web服务中启动的。最后,我们有了另一个可行的方法,但我很惊讶Spring没有更好的方法。似乎这是一个常见的请求,但我猜不是。我认为缺乏更好的方法的原因是我们通常不会广泛地处理“交易”。请记住,事务的范围可以从JDBC事务到JMS等。在您的示例中,每种事务类型的清理可能不同。当它更本地化时,可以使用
TransactionSynchronizationManager
或使用特定案例异常处理(
@Transactional.rollbackor
或冒泡异常并使用try-catch等)来处理异常,Spring对此提供了充分的支持。