@RepositoryEventHandler只能通过HTTP调用 - 为什么?

时间:2016-06-05 09:33:57

标签: spring-data-rest

当我使用@RepositoryEventHandler时,只有在通过HTTP进入存储库的调用时才会调用其方法。

有什么理由?好吧,它被称为Spring Data REST,但当我直接调用我的Repo而不是通过HTTP调用处理程序时,调用处理程序是否非常有用?

任何直接调用处理程序的方法(一些神奇的AOP东西)?

谢谢

2 个答案:

答案 0 :(得分:0)

原因是不同的Spring Data模块所涵盖的不同持久性机制已经附带了事件机制。根据您使用的那个,您现在可以使用不同的机制。

不幸的是,这不能统一为例如使用JPA并不是所有的持久性操作都需要首先通过存储库,因为JPA会自动刷新对EntityManager flush上的附加实例所做的所有更改。在这种情况下,甚至存储库实例上的AOP也无济于事。

所以你基本上有两个选择:

  • Spring Data REST为所有存储库公开的事件(因为我们基本上没有使用JPA中的自动更改跟踪)。
  • 特定于商店的事件机制,用于确保持久性机制以文档形式公开事件。

答案 1 :(得分:0)

我不知道我从其他stackoverflow问题中提出的解决方案是否被@ Olivier-drotbohm视为可接受,但来自:

SpringDataRest @RepositoryEventHandler not running when Controller is added

@RepositoryEventHandler events stop with @RepositoryRestController

您可以注入/自动连接“ ApplicationEventPublisher”,并手动触发BeforeCreateEvent / AfterCreateEvent来触发RepositoryEventHandler。

这不是一个完美的解决方案,但我希望它对您足够好(我们对其进行了测试:它可以工作)。