在Grails中,无论事务如何结束,为某些操作编写审计记录的建议模式是什么?示例:可能由于多种原因而失败的在线用户注册尝试。
基本假设,业务逻辑仅限于事务服务方法。
潜在的不确定性:我是否应该通过在服务中抛出RuntimeException来中止事务? Grails指南暗示如此,但是Burt Beckwith once said(笑着说,我确定)它就像是用锤子打自己来给自己一些照顾。
考虑到经过多次检查的冗长逻辑,在检测到冲突时抛出异常会很方便。应该回滚整个事务,但是应该写一个审计记录。
N.B。有几个审计Grails插件,但它们记录了已提交域对象的更改。
答案 0 :(得分:3)
在我们的应用程序中,我们使用Platform Core插件。基本上,当一些有趣的事情发生时,例如:
我们发起了一个事件,如下:
event(
'myApp.activity', [
userId: userService.currentUser?.id,
detail: [name: "some useful information about this activity", timestamp: new Date(), ...],
activityType: ActivityType.CREATED,
action: "create",
...
])
然后我们可以在另一个服务类中定义侦听这些事件的方法,例如
@Listener(topic="myApp.activity")
def audit(parameters) {
//create an audit record for the thing that just happened
}
好处是