Как я могу внедрить пользовательскую службу, не связанную с каким-либо классом предметной области в Grails?

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

"Cannot invoke method abc() on null object"

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

Можете ли вы предоставить дополнительную информацию о том, как создается ваша служба, как она внедряется и откуда возникает ошибка вызова метода?

Daniel 20.03.2019 17:28

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

V H 21.03.2019 12:06
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
161
1

Ответы 1

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

Другие вопросы по теме