2016-07-07 9 views
0

ich Grails 2.4.2 und habe in meiner Controller-Update-Methode mit dem folgenden Code:grails: Daten gespeichert, auch wenn ich einen Fehler gesetzt

@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 
    } 

selbst im Fall, wird die Fehler erkannt und das errors-object ist gesetzt und der method-flow führt nicht aus, dass die Daten bereits in der Datenbank geändert wurden. Die Bearbeitungsansicht wird angezeigt, zeigt jedoch nicht den Fehler an, sondern nur die Flash-Nachricht.

Wo ist mein Denkfehler?

Antwort

2

Grails rufen validate vor irgendwelchen save und überschreiben, was auch immer Sie im errors Objekt festgelegt haben. Darüber hinaus ruft Grails automatisch save für Ihre Objekte auf, nachdem Ihre Methode abgeschlossen wurde. Sie sollten entweder discard() für alle Objekte aufrufen, die Sie geändert haben, aber nicht persistieren möchten, oder eine Transaktion mit einem withTransaction-Block erstellen und manuell zurücksetzen.

0

Als @Gregor Petrin beantwortet, verwende ich jetzt den folgenden Code, für ein gleichzeitiges-Update zu überprüfen und die geändertenen Daten von dem anderen Benutzer erneut anzuzeigen ...:

@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 
    } 
Verwandte Themen