这是一个相当奇怪的问题,我已经有一段时间了,所以我疯了。
我有一个控制器扩展另一个控制器,所以我可以让多个控制器继承一个方法,它们是这样的:
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' null对象at com.ticketbranch.EventAwareController.getAuthorizedEventById(EventAwareController.groovy:14)
但我在EventController中的prinln语句打印主体ID没有任何问题?!?那么springSecurityService在EventAwareController注入为null?
有什么想法吗?建议?感谢。
答案 0 :(得分:7)
您在两个类中都有该字段,这在使用Groovy时是个问题。 Grails中的依赖注入通常就像您正在使用def <beanname>
一样完成。这是一个公共字段,因此Groovy为它创建了一个公共getter和setter,并将该字段设为私有。没有使用getter,但是Spring看到了setter,因为bean被配置为按名称连接(而不是按类型),因为setter名称(setSpringSecurityService
)和豆名。
由于你有两次,你有两个setter,一个获胜,所以你在一个类中的私有字段都有一个空值。
但是像任何公共(或受保护)属性一样,继承依赖注入,所以只需从所有子类中删除它并将其保留在基类中。