覆盖Grails插件bean的方法

时间:2011-08-20 15:21:53

标签: spring grails groovy spring-security

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 个答案:

答案 0 :(得分:5)

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

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