Я хочу создать уровень DAO в моем проекте Grails, который не будет связан ни с одним из классов предметной области и будет взаимодействовать с вторичной базой данных моего проекта. Я получаю следующую ошибку, когда пытаюсь внедрить службу в любой контроллер:
"Cannot invoke method abc() on null object"
Тем не менее, ошибка устранена и работает отлично, когда я инициализирую службу с помощью ключевого слова new в контроллере, но я знаю, что в этом нет необходимости, поскольку предполагается, что с ней справится Grails. Может ли кто-нибудь сказать мне, что мне не хватает?
Как правило, служба Grails не имеет ничего общего с классом предметной области. Я написал много служебных сервисов, которые взаимодействуют с 0 классами предметной области. Пока ваш сервис называется SomethingService, ключ заканчивается на Service и добавляется к grails-app/services/{package}/SomethingService.groovy, он автоматически внедряется в ваше приложение, а затем вы вызываете def somethingService вверху и вызываете somethingSerivce.method() для внедрения метода. Если вы создаете службу в src, вы можете вводить такие вещи через conf/sprint/resources.groovy, но это не по теме, из того, что вы спросили, непонятно





Я не думаю, что проблема имеет какое-либо отношение к тому, связана ли служба с классом предметной области. Контейнер 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 в приведенном выше примере) соответствует имени класса службы, но с первой буквой нижнего регистра (в более общем случае убедитесь, что имя свойства соответствует представлению имени свойства имени класса службы, которое обычно так же просто, как нижний регистр первой буквы имени класса).
Можете ли вы предоставить дополнительную информацию о том, как создается ваша служба, как она внедряется и откуда возникает ошибка вызова метода?