2016-07-07 3 views
0

Я использую Grails 2.4.2 и иметь в своем методе контроллера обновления следующий код:Grails: данные сохраняются даже если я устанавливаю ошибку

@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 

данные уже изменены в базе данных. Вид редактирования отображается, но не отображает ошибку, только флеш-сообщение.

Где моя ошибка в рассуждении?

ответ

2

Grails позвонит validate перед любым save и перезапишет все, что вы установили в объекте errors. Кроме того, Grails автоматически вызовет save на ваших объектах после завершения вашего метода. Вы должны либо позвонить discard() на любые объекты, которые вы изменили, но не хотите сохранять или создавать транзакцию с использованием блока withTransaction и вручную отбросить его назад.

0

Как ответил @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 
    } 
Смежные вопросы