gpt4 book ai didi

database - 具有链式调用的 Grails 服务类的事务行为

转载 作者:搜寻专家 更新时间:2023-10-30 20:31:35 25 4
gpt4 key购买 nike

我在我的应用程序中解析 xml 文件,我正在为如何设计它而苦苦挣扎。

我允许上传我们的 xml 模式的“不完整”树,这意味着只要树的结构正确,它就可以是根节点的任何子子节点。大多数节点都有仅包含一些文本(属性)的子节点,但我没有在我的小型 xml 结构示例中包含任何这些内容。

<root>
<childFoo>
<childBar>
</childBar>
</childFoo>
</root>

这些节点中的任何一个都是允许的。现在,我设计了一个 XmlInputService,它具有解析各种节点的方法。而我只是在 Controller 中检测它是什么类型的节点,并相应地将其交给服务方法。

因此,为了让我的代码保持干爽和美观,我在更高级别重复使用了我的方法。如果我将 Root 类型的文档传递给服务,它将解析 root 中直接属于 root 的任何字段,并将子节点(代表我的域类结构中的子节点)传递给适当的解析方法服务。

现在,如果用户上传包含违反约束的 xml,即具有非唯一名称等的元素,我显然想回滚。

假设我调用 parseRoot() 并向下调用 parseChildFoo()。

在那里我为那里的每个 Bar child 调用 parseChildBar()。如果 Bar 子项之一由于约束或其他原因无法验证,我显然希望将事务回滚一直级联到 parseFoo()。

我将如何实现这一目标?

最佳答案

如果您的 grails 服务具有负责解析的方法,您应该抛出一个从您的服务扩展 java.lang.RuntimeException 的异常,以便可以通知用户他们需要修改他们的 xml。因此,您的 Controller 将捕获该异常并向用户提供有意义的错误消息

只要服务方法抛出运行时异常,Grails/Spring 就会自动回滚任何数据库修改。

与 Victor 的回答相比,我所描述的方法的优点是您不必编写任何代码来让事务在失败时回滚。 Grails 会为你做这件事。 IMO,在服务方法中使用 withTransaction 闭包是没有意义的。

More info here

关于database - 具有链式调用的 Grails 服务类的事务行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4992452/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com