метод переопределения подключаемого модуля Grails - PullRequest
3 голосов
/ 20 августа 2011

Плагин Spring Security предоставляет компонент с именем «springSecurityService» типа 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

Итак, я обратился к делегированию:

import grails.plugins.springsecurity.SpringSecurityService as PluginSpringSecurityService

class CustomSpringSecurityService {

    @Autowired @Delegate
    PluginSpringSecurityService pluginSpringSecurityService

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

Затем я определил два компонента в resources.groovy

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

Во второй попытке я снова хочу, чтобы бин с именем springSecurityService ссылался на CustomSpringSecurityService, но мне также нужен бин типа grails.plugins.springsecurity.SpringSecurityService, потому что моя реализация getCurrentUser используйте некоторые другие методы этого компонента.

Однако я снова обнаружил, что зависимости pluginSpringSecurityService не устанавливаются.Есть ли более простой способ переопределить метод bean-компонента, предоставляемый плагином, в контексте, который подвержен внедрению зависимости?

1 Ответ

5 голосов
/ 21 августа 2011

Вернитесь к подклассам и переопределите bean-компонент в resources.groovy, но удовлетворите зависимости.Они автоматически вводятся по имени, но все в списке, поэтому добавьте их явно в свое переопределение:

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