2011-09-30 65 views
4

這是一個相當奇怪的問題,我一直在這裏一段時間,所以我瘋了。springSecurityService在基本控制器中爲空

我有延伸的另一控制器,所以我可以有多個控制器繼承的方法和他們去這樣的控制器:

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:無法在 空對象上獲得屬性'委託人' com.ticketbranch.EventAwareController.getAuthorizedEventById(EventAwareController.groovy:14)

但我在EventController中的prinln語句打印主體ID沒有任何問題?!?所以springSecurityService在EventAwareController中被注入爲null?

任何想法?建議?謝謝。

回答

7

您在這兩個類中都有這個字段,這在使用Groovy時是個問題。 Grails中的依賴注入通常按照您的操作完成,其中def <beanname>。這是一個公共領域,因此Groovy爲它創建了一個公共getter和setter,並使該字段保密。 getter沒有被使用,但Spring看到setter,並且由於bean被配置爲按名稱連接(而不是按類型),因爲設置者名稱(setSpringSecurityService)和bean名稱之間存在匹配,所以注入bean。

既然你有這兩次,你有兩個setters和一個勝,所以你將有一個類的私人領域的空值。

但是就像任何公共(或受保護的)屬性一樣,依賴注入是繼承的,所以只需從所有的子類中移除它並將其留在基類中。

+0

很合理,謝謝。 – Micor

+0

非常酷的答案,我花了一個小時試圖瞭解到底發生了什麼......謝謝你幫助我理解發生了什麼:) –