Grails插件bean的覆盖方法

Posted

技术标签:

【中文标题】Grails插件bean的覆盖方法【英文标题】:override method of Grails plugin bean 【发布时间】:2011-10-31 06:04:31 【问题描述】:

Spring Security 插件提供了一个名为“springSecurityService”的 bean,类型为 grails.plugins.springsecurity.SpringSecurityService。我需要重写此服务的getCurrentUser 方法。

我首先尝试使用扩展来做到这一点

class CustomSecurityService extends SpringSecurityService 

    @Override
    Object getCurrentUser() 
        // my implementation uses methods from the parent class
    

为了将插件定义的 bean 替换为上述类的实例,我将以下内容添加到 resources.groovy

springSecurityService(CustomSpringSecurityService)

但这不起作用,因为没有设置 SpringSecurityService(我正在扩展的类)的依赖项,所以我得到 NullPointerExceptions。未设置这些依赖项的原因是不再有 SpringSecurityService 类型的 spring bean

所以,然后我转向委托:

import grails.plugins.springsecurity.SpringSecurityService as PluginSpringSecurityService

class CustomSpringSecurityService 

    @Autowired @Delegate
    PluginSpringSecurityService pluginSpringSecurityService

    Object getCurrentUser() 
        // my implementation uses methods from pluginSpringSecurityService
    

然后我在resources.groovy中定义了两个bean

springSecurityService(CustomSpringSecurityService)
pluginSpringSecurityService(grails.plugins.springsecurity.SpringSecurityService)

在第二次尝试中,我再次希望名为“springSecurityService”的 bean 引用 CustomSpringSecurityService,但我还需要一个类型为 grails.plugins.springsecurity.SpringSecurityService 的 bean,因为我对 getCurrentUser 的实现使用了该 bean 的一些其他方法.

但是,我再次发现 pluginSpringSecurityService 的依赖关系没有被设置。在依赖注入的上下文中,是否有更简单的方法来覆盖插件提供的 bean 的方法?

【问题讨论】:

【参考方案1】:

返回子类化并重新定义resources.groovy 中的bean,但要满足依赖关系。它们是按名称自动注入的,但都已列出,因此请明确将它们添加到您的重新定义中:

springSecurityService(CustomSpringSecurityService) 
   authenticationTrustResolver = ref('authenticationTrustResolver')
   grailsApplication = ref('grailsApplication')
   passwordEncoder = ref('passwordEncoder')
   objectDefinitionSource = ref('objectDefinitionSource')
   userDetailsService = ref('userDetailsService')
   userCache = ref('userCache')

【讨论】:

谢谢伯特,这行得通。你知道为什么当我尝试委托方法时 SpringSecurityService 的依赖关系没有被自动装配吗?

以上是关于Grails插件bean的覆盖方法的主要内容,如果未能解决你的问题,请参考以下文章

Grails 覆盖插件服务静态方法

如何在 Grails spring-security-core 插件中覆盖 Login/authenticate 方法?

从 Grails 插件覆盖控制器

在 Grails 2.2 中覆盖插件视图

从 Grails Twitter-Bootstrap 插件覆盖 CSS

扩展 Grails 插件的功能