Как я могу внедрить пользовательский сервис, не связанный с каким-либо классом домена в Grails? - PullRequest
0 голосов
/ 20 марта 2019

Я хочу создать слой DAO в моем проекте grails, который не будет связан ни с одним из классов домена и будет взаимодействовать со вторичной базой данных моего проекта. Я получаю следующую ошибку при попытке внедрить службу в любой контроллер:

"Cannot invoke method abc() on null object"

Тем не менее, ошибка устраняется и прекрасно работает, когда я инициализирую службу с помощью ключевого слова new в контроллере, но я знаю, что в этом нет необходимости, поскольку предполагается, что grails его обрабатывает. Кто-нибудь может сказать мне, что мне не хватает?

1 Ответ

0 голосов
/ 25 марта 2019

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

...