Как в методе onChange подключаемого модуля Grails Audit Loggin получить ссылку на владеющий объектом аудита домена?

Я успешно запустил плагин ведения журнала аудита Grails, похоже, это именно то, что мне нужно, за исключением того, что я не могу понять, как получить ссылку на проверяемый объект домена из метода onChange. Ниже приведен код из примера класса Person плагина с несколькими дополнительными строками того, чего я пытаюсь достичь:

class Person {

   static auditable = true 
   Long id 
   Long version

   String firstName 
   String middleName 
   String lastName

   String email

   static hasMany = [emailRecords : EmailRecord]    
   static constraints = { 
      firstName(nullable:true,size:0..60) 
      middleName(nullable:true,size:0..60) 
      lastName(nullable:false,size:1..60) 
      email(email:true) 
   }

   def onSave = { 
      println "new person inserted" // may optionally refer to newState map 
   } 

   def onDelete = { 
      println "person was deleted" // may optionally refer to oldState map 
   } 

   def onChange = { 
     oldMap,newMap -> 
        println "Person was changed ..." 
        oldMap.each({ key, oldVal -> 
           if(oldVal != newMap[key]) { 
              println " * $key changed from $oldVal to " + newMap[key] 
              // how can achieve something like this?
              if(key == "email"){
                 def personInstance = this // this didn't work, I'm not sure how I can get such a reference to the owning domain object
                 personInstance.addToEmailRecords(
                    new EmailRecord(
                       email:newMap[key],
                       date: new Date()
                    ).save()
                 )
              }
           } 
        }) 
     }
   }

person esdot    schedule 16.09.2011    source источник


Ответы (1)


Для этого варианта использования вы, вероятно, просто захотите использовать стандартные события GORM с использованием isDirty() и getPersistentValue() хотя бы для обновления. В частности, как указано в документации к плагину для ведения журнала аудита, он предназначен для работать с сущностями после того, как они были зафиксированы в хранилище данных (и поэтому, например, идентификатор объекта гарантированно будет присвоен).

Попробуйте что-то вроде следующего:

class Person {
    // blah, blah, blah
    def beforeInsert = {
        if (email) {
            addToEmailRecords(new EmailRecord(email: email, date: new Date()))
        }
    }

    def beforeUpdate = {
        if (isDirty("email")) {
            addToEmailRecords(new EmailRecord(email: email, date: new Date()))
        }
    }
}

Таким образом, вы не должны вмешиваться в изменение объекта после того, как его изменения были зафиксированы.

person ig0774    schedule 16.09.2011
comment
Спасибо, сэр, это гораздо более чистый способ достичь моей цели! - person esdot; 19.09.2011