我希望在我的grails项目中创建DAO层,该层与任何域类无关,并且将与我项目的辅助数据库进行交互。当我尝试在任何控制器中注入服务时,我收到以下错误:
"Cannot invoke method abc() on null object"
但是,当我使用控制器中的new
关键字初始化服务时,错误得到解决并且工作正常,但我知道这不应该是必要的,因为grails应该处理它。谁能告诉我我错过了什么?
我不认为该问题与服务是否与域类相关联有任何关系。 DI容器对此一无所知。
如果你有这样的控制器:
// grails-app/controllers/demo/SomeController.groovy
package demo
class SomeController {
SomeService someService
def someControllerAction() {
someService.abc()
// ...
}
}
这样的服务......
// grails-app/services/demo/SomeService.groovy
package demo
class SomeService {
void abc() {
// ...
}
}
那会很好。
几乎不可能在没有看到你的代码你做错了什么的情况下肯定地说,但是一种可能性是这样的,这是行不通的:
// grails-app/controllers/demo/SomeController.groovy
package demo
class SomeController {
def someControllerAction() {
// This is a local variable, not
// a property and as such will not
// be subjected to dependency injection.
SomeService someService
// ...
someService.abc()
// ...
}
}
此外,请确保属性名称(上面示例中的someService
)与服务类名称匹配,但是使用小写的第一个字母(更一般地,确保属性名称与服务类名称的属性名称表示匹配,这通常是像下壳一样简单的类名的第一个字母)。