我以前从未使用Grails服务,但根据我的Web搜索,它们可以注入到域对象中。所以,如果我有以下的领域类(假设BookService
某处定义),如何向Grails域对象注入类似服务的组件?
class Book {
BookService bookService
}
当我实例化一个对象Book
使用,def book = new Book()
,book.bookService
应设置?
如果是这样的话,如果我想注入外部服务(或类似服务的组件),该怎么办?例如,如果有可用的ISBN API客户端,我希望Grails能以相同的方式注入它吗?例如,假设客户端是IsbnApi
,我该如何自动注入其他服务?下面的代码是否工作?
class Book {
@Transient
@Autowire
IsbnApi isbnApi
}
基于对这个问题先前答复,我已经定义的域类是这样的:
class Book {
static transients = ['isbnApi']
IsbnApi isbnApi
}
现在,这可能是我所需要的,但我也想测试即使不需要运行应用,自动注入也可以工作,即使是。在我的单元测试中,我必须手动设置模拟“服务”。
IsbnApi isbnApi = Mock()
Book book = new Book()
book.isbnApi = mockIsbnApi
我试图通过移动测试test/integration
检查自动注射和使用doWithSpring
设置豆。
def doWithSpring() {
isbnApi = (InstanceFactoryBean, mockIsbnApi, isbnApi)
}
void "test automatic injection"() {
given:
IsbnApi isbnApi = Mock()
Book book = new Book()
//removed: book.isbnApi = mockIsbnApi
expect:
book.isbnApi //this fails
}
我还从this answer to a similar question找到了其他信息。特别是,
注意因为你使用“高清”你不需要将它添加到 瞬变列出。你是否试图从静态方法访问它? 这是一个实例字段,因此您只能从实例访问它。
在哪里存储您的IsbnApi?常规/ src目录? – 2014-09-22 06:05:57
它可以在任何地方:'src/groovy',或来自另一个jar等。 – 2014-09-22 08:49:42