grails:即使我设置了错误,数据也会保存
grails: data saved even if I set an error
我正在使用 grails 2.4.2 并且在我的控制器更新方法中有以下代码:
@Transactional
def update(ErtIncommingInvoice ertIncommingInvoiceInstance) {
if (ertIncommingInvoiceInstance == null) {
notFound()
return
}
// Concurrent-Update Test
if (ertIncommingInvoiceInstance.version != params.version as int) {
flash.warning = "Another user changed the record! (Concurrent Update Error)"
ertIncommingInvoiceInstance.errors.rejectValue("ertInfo", "concurrent.update.error")
respond ertIncommingInvoiceInstance.errors, view:'edit'
return
}
即使在这种情况下,检测到错误并设置错误对象并且方法流不执行
ertIncommingInvoiceInstance.save flush:true, failOnError: true
数据库中的数据已经更改。
显示编辑视图,但不显示错误,仅显示闪现消息。
我的推理错误在哪里?
Grails 将在任何 save
之前调用 validate
并覆盖您在 errors
对象中设置的任何内容。此外,Grails 将在您的方法完成后自动对您的对象调用 save
。您应该对已更改但不希望保留的任何对象调用 discard()
,或者使用 withTransaction
块创建事务并手动将其回滚。
正如@Gregor Petrin 回答的那样,我现在使用以下代码来检查并发更新并重新显示来自其他用户的更改数据...:
@Transactional
def update(ErtIncommingInvoice ertIncommingInvoiceInstance) {
if (ertIncommingInvoiceInstance == null) {
notFound()
return
}
// Concurrent-Update Test
if (ertIncommingInvoiceInstance.version != params.version as int) {
ertIncommingInvoiceInstance.discard()
ertIncommingInvoiceInstance = ErtIncommingInvoice.get(params.id)
ertIncommingInvoiceInstance.errors.reject("concurrent.update.error")
respond ertIncommingInvoiceInstance.errors, view:'edit'
return
}
我正在使用 grails 2.4.2 并且在我的控制器更新方法中有以下代码:
@Transactional
def update(ErtIncommingInvoice ertIncommingInvoiceInstance) {
if (ertIncommingInvoiceInstance == null) {
notFound()
return
}
// Concurrent-Update Test
if (ertIncommingInvoiceInstance.version != params.version as int) {
flash.warning = "Another user changed the record! (Concurrent Update Error)"
ertIncommingInvoiceInstance.errors.rejectValue("ertInfo", "concurrent.update.error")
respond ertIncommingInvoiceInstance.errors, view:'edit'
return
}
即使在这种情况下,检测到错误并设置错误对象并且方法流不执行
ertIncommingInvoiceInstance.save flush:true, failOnError: true
数据库中的数据已经更改。 显示编辑视图,但不显示错误,仅显示闪现消息。
我的推理错误在哪里?
Grails 将在任何 save
之前调用 validate
并覆盖您在 errors
对象中设置的任何内容。此外,Grails 将在您的方法完成后自动对您的对象调用 save
。您应该对已更改但不希望保留的任何对象调用 discard()
,或者使用 withTransaction
块创建事务并手动将其回滚。
正如@Gregor Petrin 回答的那样,我现在使用以下代码来检查并发更新并重新显示来自其他用户的更改数据...:
@Transactional
def update(ErtIncommingInvoice ertIncommingInvoiceInstance) {
if (ertIncommingInvoiceInstance == null) {
notFound()
return
}
// Concurrent-Update Test
if (ertIncommingInvoiceInstance.version != params.version as int) {
ertIncommingInvoiceInstance.discard()
ertIncommingInvoiceInstance = ErtIncommingInvoice.get(params.id)
ertIncommingInvoiceInstance.errors.reject("concurrent.update.error")
respond ertIncommingInvoiceInstance.errors, view:'edit'
return
}