Spring Data REST具有以下事件处理程序,它们会在HTTP请求(例如POST,PUT等)上触发。
@RepositoryEventHandler(Author.class)
public class AuthorEventHandler {
Logger logger = Logger.getLogger("Class AuthorEventHandler");
@HandleBeforeCreate
public void handleAuthorBeforeCreate(Author author){
logger.info("Inside Author Before Create....");
}
@HandleAfterCreate
public void handleAuthorAfterCreate(Author author){
logger.info("Inside Author After Create ....");
}
}
我的问题是,如果我访问@HandleBeforeCreate中的另一个数据库实体,例如Book,并对其进行修改,它会在单独的事务中发生还是会在与Author实体创建相同的事务中发生?
我已经检查过Spring Data REST文档,但此处未提及。
答案 0 :(得分:1)
根据我的经验,这些处理程序是在主要事务之外执行的。从字面上看是“之前”和“之后”。关于“独立”交易-如果将事件处理程序标记为@Transactional
,它将在其单独交易中执行。
如果您需要在主事务中执行一些额外的操作,则可以使用publishing events from the aggregate root。在这种情况下,您应该从AbstractAggregateRoot扩展实体,并向其中添加一些注册适当事件的方法,例如:
@Entity
public class Model extends AbstractAggregateRoot {
// entity stuff...
public Model initExtraAction(SomeData payload) {
registerEvent(new ExtraActionEvent(this, payload));
return this;
}
}
其中registerEvent是AbstractAggregateRoot
方法,而ExtraActionEvent
是您的自定义事件,如下所示:
@Value
public class ExtraActionEvent {
private Model model;
private SomeData payload;
}
然后您可以实现普通的事件处理程序
@Service
public class EventHandler {
@EventListener
@Transactional(propagation = MANDATORY) // optional
public void handleExtraActionEvent (ExtraActionEvent e) {
Model model = e.getModel();
SomeData payload = e.getPayload();
// Extra actions...
}
}
,如果您在调用{{1之前,在之前,调用了initExtendAction
方法,将在与主交易相同的交易中与主交易进行调用。 }}的回购方法(为确保可以在同一笔交易中完成,您可以使用可选 save
批注):
@Transactional(propagation = MANDATORY)
在 Spring Data REST 项目中,我们可以在创建或更新实体之前在'RepositoryEventHandler'中调用modelRepo.save(model.initExtraAction(payload));
方法:
initExtraAction
您可以在Oliver Gierke Spring RestBucks演示项目中找到使用@RepositoryEventHandler(Model.class)
public class ModelEventHandler {
@HandleBeforeCreate
@HandleBeforeSave
public void handleBeforeCreateOrSave(Model model){
// Some manipulations...
model.initExtraAction(...);
}
}
的完整示例。