springSecurityService является нулевым в базовом контроллере - PullRequest
4 голосов
/ 30 сентября 2011

Это довольно странная проблема, и я какое-то время занимался этим, поэтому схожу с ума.

У меня есть контроллер, расширяющий другой контроллер, так что я могу иметь несколько контроллеров, наследующих метод, и они идут примерно такthis:

class EventController extends EventAwareController {

    def springSecurityService

    def edit = {
        // this line prints out principal id
        println springSecurityService.principal.id
        def eventInstance = getAuthorizedEventById(params.id)
        if (!eventInstance) {
            flash.message = "${message(code: 'event.not.found.message')}"
            redirect(action: "list", controller: "event")
            return false
        }
}

class EventAwareController {
    def eventService
    def springSecurityService

    def getAuthorizedEventById(def eventId) {
        def event
        if (eventId) {
            // this springSecurityService is null and throws an error
            event = eventService.findAuthorizedEvent(eventId, springSecurityService.principal.id)
            if (event) {
                session.eventId = eventId
            }
        }
        return event
    }

}

EventAwareController генерирует:

java.lang.NullPointerException: Невозможно получить свойство 'Principal' для нулевого объекта в com.ticketbranch.EventAwareController.getAuthorizedEventById (EventAwareCwaregroovy: 14)

но мой оператор prinln в EventController печатает основной идентификатор без каких-либо проблем?!?Таким образом, SpringSecurityService вводится как ноль в EventAwareController?

Есть идеи?предложения?Спасибо.

1 Ответ

7 голосов
/ 30 сентября 2011

У вас есть поле в обоих классах, и это проблема при использовании Groovy. Внедрение зависимостей в Grails обычно выполняется так же, как и вы, с def <beanname>. Это открытое поле, поэтому Groovy создает для него общедоступный метод получения и установки и делает поле частным. Получатель не используется, но Spring видит установщик, и, поскольку bean-компоненты настроены для проводки по имени (а не по типу), бин вводится, так как есть совпадение между именем сеттера (setSpringSecurityService) и именем бина .

Поскольку у вас есть это дважды, у вас есть два сеттера и один выигрыш, поэтому у вас будет нулевое значение для частного поля в одном классе.

Но, как и любое открытое (или защищенное) свойство, внедрение зависимостей наследуется, поэтому просто удалите его из всех ваших подклассов и оставьте в базовом классе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...