微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

spring – 重写Grails插件bean的方法

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的依赖项.是否有一种更简单的方法来覆盖插件在受依赖注入影响的上下文中提供的方法

解决方法:

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐