Grails 3.3 @Service注释不能为抽象服务创建bean?

时间:2018-09-08 16:16:50

标签: java spring grails

例如,我有这样的服务:

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

我发现,如果我创建这样的服务(以抽象方式),grails将不会生成名为myDomainService的bean,因此无法在其他服务中调用此服务。

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 :(得分:1)

在GORM数据服务中,您可以使用Interfaces抽象类,在这里引用文档

  

如果您遇到GORM不知道如何实现的方法,   那么您可以使用抽象类来提供实现。

在您的示例中,您提供了可由GORM实现的列表方法,因此您可以使用接口,例如,以Person域类为例,尝试

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()
    }
} 

通过这种方式,将服务注入到其他人或控制器中应该没有问题,例如,这里我在EmailService.groovy的EmailService中注入PersonService

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'
    }
}

我在另一个服务和控制器中添加了该服务的注入示例,也许与您有关。我还附上了示例存储库,我hope您觉得它有用