开发者

override method of Grails plugin bean

The Spring Security plugin provides a bean named 'springSecurityService' of type grails.plugins.springsecurity.SpringSecurityService. I need to override the getCurrentUser method of this service.

I first tried to do it using extension

class CustomSecurityService extends SpringSecurityService {

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

To replace the bean defined by the plugin with an instance of the class above I added the following to resources.groovy

springSecurityService(CustomSpringSecurityService)

But this didn't work because none of the dependencies of SpringSecurityService (the class I'm extending) are set so I get NullPointerExceptions. The reason these dependencies are not set is because there's no longer a spring bean of type SpringSecurityService

So, I then turned to delegation:

import grails.plugins.springsecurity.SpringSecurityService as PluginSpringSecurityService

class CustomSpringSecurityService {

    @Autowired @Delegate
    PluginSpringSecurityService pluginSpringSecurityService

    Object getCurrentUser() {
        // my implementation uses methods from pluginSpringSecurityService
    }
}
开发者_如何学Python

I then defined two beans in resources.groovy

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

In this second attempt, I again want the bean named 'springSecurityService' to refer to CustomSpringSecurityService, but I also need a bean of type grails.plugins.springsecurity.SpringSecurityService, because my implememtation of getCurrentUser use some other methods of that bean.

However, I again found that the dependencies of pluginSpringSecurityService are not being set. Is there an easier way to override a method of a bean provided by a plugin in a context that is subject to dependency injection?


Go back to subclassing and redefining the bean in resources.groovy, but satisfy the dependencies. They're auto-injected by name but all listed, so add them explicitly to your redefinition:

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜