Grails 3.3 @ Сервисная аннотация не делает бин для абстрактного сервиса? - PullRequest
0 голосов
/ 08 сентября 2018

Например, у меня есть такой сервис:

@Service(MyDomain)
abstract class MyDomainService {
    abstract List<MyDomain> list(Map args)
    ....
}

Я обнаружил, что если я создаю службу, подобную этой (абстрактно), Grails не создаст компонент с именем myDomainService, поэтому я не могу вызвать эту службу в другой службе.

class MyOtherService {
    MyDomainService myDomainService

    def method() {
        myDomainService.list() // NPE. Also Holders.grailsApplication.mainContext.beanDefinitionNames could not find any bean with name myDomainService.
    }
}

А также, @Autowired не работает для меня.

Но я не знаю, почему контроллер мог правильно использовать этот сервис:

class MyController {
    MyDomainService myDomainService  // it works
}

Я хочу использовать этот сервис в другом сервисе. Что мне делать?

Спасибо.

1 Ответ

0 голосов
/ 09 сентября 2018

В сервисах данных GORM вы можете использовать интерфейсы абстрактных классов, здесь я цитирую документацию

Если вы столкнетесь с методом, который GORM не знает, как реализовать, тогда вы можете предоставить реализацию, используя абстрактный класс.

В вашем примере вы предоставляете метод списка, который может быть реализован GORM, чтобы вы могли использовать интерфейс, например, и иметь класс домена Person в качестве примера try

package app.demo

import grails.gorm.services.Service

@Service(Person)
interface IPersonService {
    List<Person> list()
}

Если вам нужно реализовать метод, который GORM не знает как, то вы можете попробовать, например, PersonService.groovy

package app.demo

import grails.gorm.services.Service

interface IPersonService {
    List<Person> list()
}

@Service(Person)
abstract class PersonService implements IPersonService {

    List<Person> find(final String name) {
        Person.where { name == name }.list()
    }
} 

Таким образом, не должно быть проблем при внедрении служб в другие или в контроллеры, например, здесь я внедряю PersonService в EmailService по адресу EmailService.groovy

package app.demo

class EmailService {

    PersonService personService

    void send() {
        List<Person> personList = personService.find('ana')

        personList.each { Person person ->
            println "Sending email to $person.name $person.email"
        }
    }
}

А в контроллере впрыскивает EmailService

package app.demo

class PersonController {

    EmailService emailService

    def index() {
        emailService.send()

        render 'sending'
    }
}

Я добавил пример внедрения службы в другой сервис и в контроллер, возможно, есть что-то, что относится к вам. Я также прилагаю демонстрационный репозиторий. Я надеюсь вы найдете это полезным

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...