복붙노트

[SPRING] Grails 플러그인 빈의 오버라이드 메소드

SPRING

Grails 플러그인 빈의 오버라이드 메소드

Spring Security 플러그인은 grails.plugins.springsecurity.SpringSecurityService 유형의 'springSecurityService'라는 bean을 제공합니다. 이 서비스의 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'라는 bean이 CustomSpringSecurityService를 참조하도록하고 싶습니다. 그러나 getCurrentUser를 구현할 때 그 bean의 다른 메소드를 사용하기 때문에 grails.plugins.springsecurity.SpringSecurityService 유형의 bean도 필요합니다.

그러나 pluginSpringSecurityService의 종속성이 설정되어 있지 않음을 다시 확인했습니다. 의존성 삽입의 영향을받는 컨텍스트에서 플러그인이 제공하는 bean의 메소드를 재정의하는 더 쉬운 방법이 있습니까?

해결법

  1. ==============================

    1.resources.groovy에서 서브 클래스를 만들고 빈을 다시 정의하지만 의존성을 만족시킨다. 그것들은 이름으로 자동 삽입되지만 모두 나열되어 있으므로 명시 적으로 재정의에 추가하십시오 :

    resources.groovy에서 서브 클래스를 만들고 빈을 다시 정의하지만 의존성을 만족시킨다. 그것들은 이름으로 자동 삽입되지만 모두 나열되어 있으므로 명시 적으로 재정의에 추가하십시오 :

    springSecurityService(CustomSpringSecurityService) {
       authenticationTrustResolver = ref('authenticationTrustResolver')
       grailsApplication = ref('grailsApplication')
       passwordEncoder = ref('passwordEncoder')
       objectDefinitionSource = ref('objectDefinitionSource')
       userDetailsService = ref('userDetailsService')
       userCache = ref('userCache')
    }
    
  2. from https://stackoverflow.com/questions/7132679/override-method-of-grails-plugin-bean by cc-by-sa and MIT license