springSecurityService在基本控制器中为null

Mic*_*cor 4 grails spring-security

这是一个相当奇怪的问题,我已经有一段时间了,所以我疯了.

我有一个控制器扩展另一个控制器,所以我可以让多个控制器继承一个方法,他们是这样的:

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
    }

}
Run Code Online (Sandbox Code Playgroud)

EventAwareController投掷:

java.lang.NullPointerException:无法在com.ticketbranch.EventAwareController.getAuthorizedEventById(EventAwareController.groovy:14)的null对象上获取属性'principal'

但我在EventController中的prinln语句打印主体ID没有任何问题?!?那么springSecurityService在EventAwareController中注入为null?

有任何想法吗?建议?谢谢.

Bur*_*ith 7

您在两个类中都有该字段,这在使用Groovy时是个问题.Grails中的依赖注入通常就像你正在做的一样def <beanname>.这是一个公共字段,因此Groovy为它创建了一个公共getter和setter,并将该字段设为私有.没有使用getter,但Spring看到了setter,因为bean被配置为按名称连接(而不是按类型),因为setter name(setSpringSecurityService)和bean名称之间存在匹配,所以注入bean.

由于你有两次,你有两个setter,一个获胜,所以你在一个类中的私有字段有一个空值.

但是,与任何公共(或受保护)属性一样,依赖注入是继承的,因此只需将其从所有子类中删除并将其保留在基类中.