Служба данных Grails не может использовать обычную службу

#grails

#grails

Вопрос:

С очередным днем Covid. Когда я использую generate-all, Grails создает для меня службу данных. Я начинаю понимать, что такое служба передачи данных.

У меня также есть свой собственный сервис для использования моими авторскими и книжными классами. Я называю свою службу ImportService. У меня есть методы в ImportService для очистки данных моей книги, прочитанных из файла CSV, прежде чем служба данных сохранит мои книги в базе данных. Я также следую инструкции, чтобы сделать службу данных абстрактным классом. Итак, я могу поместить свой собственный метод в службу данных.

Поскольку у автора есть свой собственный AuthorService, а у книги есть свой собственный BookService, я хочу, чтобы другая служба данных имела доступ к методу в моем ImportService. Таким образом, мне не нужно копировать и вставлять код импорта CSV несколько раз. Итак, я помещаю строку ImportService importService в класс AuthorServie и класс BookService. Это не очень хорошо. importService всегда имеет значение NULL внутри классов службы данных. Я Гуглю проблему. Они говорят, что я не могу внедрить другую службу в grails.gorm.services.Обслуживание.

Существует сообщение, в котором говорится о создании компонента. Я новичок в Grails. Я понятия не имею, о чем они говорят, даже с опубликованными кодами. Часть моего опыта — это язык ассемблера, C и Pascal. Моя голова заполнена жаргоном, таким как «сверху вниз», «Подпрограмма», «Библиотека», «адрес» и «указатель». Я понятия не имею, что такое компонент.

Вот что это такое. Мне интересно, является ли это ошибкой или по замыслу, что вы не можете внедрить службу в службу gorm.

Спасибо за ваш «указатель».

Комментарии:

1. Вы не указали, какую версию Grails или какую версию GORM вы используете, поэтому я не знаю, актуально это или нет, но в GORM была соответствующая ошибка, которую мы недавно исправили. См. github.com/grails/gorm-hibernate5/issues/202 .

2. Я использую Grails 4.0.3. Я новичок в Grails. Я не знаю, где искать версию GORM. Не могли бы вы показать мне, где можно получить версию GORM, пожалуйста? Спасибо! Я использовал Grails 4.0.4, но он продолжал сбоить. Кто-то предложил откатиться к 4.0.3. Вот почему я использую 4.0.3.

3. «Не могли бы вы показать мне, где взять версию GORM, пожалуйста?» — Трудно сказать, не глядя на вашу сборку, но место, где версия GORM по умолчанию будет указана в Grails 4.0.3, будет в gradle.properties файле в верхней части проекта.

4. Спасибо. Это номер версии. Является ли это причиной проблемы, из-за которой я не могу использовать службу в службе данных? grailsVersion=4.0.3 gorm.version=7.0.6.RELEASE

5. Я считаю, что исправление находится в версии 7.0.7.RELEASE.

Ответ №1:

Смотрите проект на https://github.com/jeffbrown/tom6502servicedi . В этом проекте используются Grails 4.0.3 и GORM 7.0.7.

https://github.com/jeffbrown/tom6502servicedi/blob/main/grails-app/services/tom6502servicedi/ImportService.groovy

 package tom6502servicedi

class ImportService {

    int getSomeNumber() {
        42
    }
}
  

https://github.com/jeffbrown/tom6502servicedi/blob/917c51ee173e7bb6844ca7d40ced5afbb8d9063f/grails-app/services/tom6502servicedi/AuthorService.groovy

 package tom6502servicedi

import grails.gorm.services.Service
import org.springframework.beans.factory.annotation.Autowired

@Service(Author)
abstract class AuthorService {

    @Autowired
    ImportService importService

    // ...

    int getSomeNumberFromImportService() {
        importService.someNumber
    }
}
  

https://github.com/jeffbrown/tom6502servicedi/blob/917c51ee173e7bb6844ca7d40ced5afbb8d9063f/grails-app/controllers/tom6502servicedi/AuthorController.groovy

 package tom6502servicedi

import grails.validation.ValidationException
import static org.springframework.http.HttpStatus.*

class AuthorController {

    AuthorService authorService

    // ...

    def someNumber() {
        render "The Number Is ${authorService.someNumberFromImportService}"
    }
}
  

Отправка запроса к этому someNumber действию подтвердит, что ImportService вводится в AuthorService и AuthorService вводится в AuthorController .

 $ curl http://localhost:8080/author/someNumber
The Number Is 42
  

Комментарии:

1. Вау! Это чудо! Полностью противоречит закону физики!!! Добавление импорта org.springframework.beans.factory.annotation. Автоматическое подключение и слово @Autowired к службе данных создают Grails, чтобы теперь получить ссылку на мой класс ImportService. T-H-A-N-K-S!!!