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 spring-security-core 插件中覆盖 Login/authenticate 方法?