替换 Grails 插件侦听器

Replace Grails plugin listener

我需要扩展 audit-logging plugin 的侦听器 class,以便在某些情况下提供不同的功能。

为此,我创建了这个 class:

class CustomAuditLogListener extends AuditLogListener{

  public CustomAuditLogListener(Datastore datastore) {
    super(datastore)
  }

  @Override
  protected void onPreUpdate(event) {
     . .  .
}
}

现在,为了让插件使用这个 class 而不是默认的 AuditLogListener,在 Bootstrap.groovy 内,我尝试从应用程序侦听器中删除 AuditLogListener,并添加自定义侦听器:

 def applicationContext = servletContext.getAttribute(GrailsApplicationAttributes.APPLICATION_CONTEXT)
    log.debug("Application listeners - PRE")
    log.debug(applicationContext.getApplicationListeners())
    // Remove all the listeners registered by the audit plugin.
    applicationContext.getApplicationListeners.each { listener ->
      if (listener.class == AuditLogListener.class) {
        servletContext.getApplicationListeners.remove(listener)
        log.debug("AuditLogListener removed ")
      }
    }

    grailsApplication.mainContext.eventTriggeringInterceptor.datastores.each { key, datastore ->
      // Don't register the listener if we are disabled
      if (!grailsApplication.config.auditLog.disabled && !datastore.config.auditLog.disabled) {
          def listener = new CustomAuditLogListener(datastore)
          listener.with {
             // some options
          }
          applicationContext.addApplicationListener(listener)
          log.debug("Add new listener CustomAuditLogListener")
      }
    }
    log.debug("Application listeners -POST")
    log.debug(applicationContext.getApplicationListeners())

Application listeners - PRE returns empty list

Add new Listener CustomAudtilogListener is logged

Application Listeners - POST returns empty list

我注册侦听器的方式是从插件注册侦听器的方式复制而来的,见此 class

总而言之,我需要用我自己的 CustomAuditLogListener 替换 AuditLogListener。目前上述过程不起作用。有什么建议吗?

嘿抱歉,但是 post 确实看起来有点混乱,虽然我想我明白了

I need to extend the listener class of audit-logging plugin.

Now, in order for the plugin to use this class instead of the default AuditLogListener,

所以您正试图覆盖 auditLogListener。

您的问题可能是您没有在 conf/spring/resources.groovy.

中将其声明为覆盖

我在这里为 class 而不是听众做了类似的事情:

https://github.com/vahidhedayati/testwschat/blob/master/test/unit/anythingbut/grails/plugin/wschat/MyOverrideServiceSpec.groovy

https://github.com/vahidhedayati/testwschat/blob/master/grails-app/conf/spring/resources.groovy

这里还有类似的东西:

grails kickstart plugin KickstartFilters how to prevent password information on logs

基本上一旦你声明了你的 bean

yourAppFilters(KickstartFilters)

然后这会欺骗您的 grails-app 和任何可能引用 KickstartFilters 的插件现在将您的 AppFilters 作为替代

试试这样的 bean:(ctrl shift o) 拉入 CustomAuditLogListener

AuditLogListener(CustomAuditLogListener){
 grailsApplication = ref('grailsApplication')
}