例如,我有这样的服务:
@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
}
我想在其他服务中使用此服务。我该怎么办?
谢谢。
答案 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您觉得它有用