我在我的 grails 项目的 src 目录中创建了一个 java 服务/文件,并在 resources.groovy 的 bean 中进行了定义。
beans = {
elasticsearchConfigManager(ElasticsearchConfigManager){}
accounts(AccountsService){}
}
我可以通过编写“def elasticsearchConfigManager”将其注入(inject)到我的一个拦截器中,并毫无异常(exception)地使用注入(inject)的 java 服务的方法。
另外,我可以将它注入(inject)我的一项 grails 服务中。但在这种情况下,当我尝试使用注入(inject)类的属性时,我得到空指针异常。
@Transactional
Class AccountService{
def elasticsearchConfigManager
def index(params){
def action=params.get("task")
return this."${action}"(params)
}
def getAccountById(params){
def indexName=params.get("service")
def docId=params.get("accountId")
try{
GetResponse hit=elasticsearchConfigManager.elasticsearchClient.prepareGet(indexName, "_doc", docId).get()
....}
我在这里遇到异常:elasticsearchConfigManager.elasticsearchClient,因为虽然 elasticsearchConfigManager 被注入(inject),但它被认为是 null(我可以通过单击定义的变量 elasticsearchConfigManager 从 Accounts 服务遍历服务,我可以在 Intellij 中看到注入(inject)符号)。
但是,当我以以下方式注入(inject)时,它毫无异常(exception)地起作用。
def elasticsearchConfigManager= Holders.getGrailsApplication().getMainContext().getBean("elasticsearchConfigManager")
可能的原因是什么?我只是想知道。帮助将不胜感激! :)
目录结构:
最佳答案
您的 resources.groovy
中有以下内容:
accounts(AccountsService){}
Grails 服务默认添加到应用程序上下文中,因此通常您不会自己定义该 bean 定义。你的 bean 被称为
accounts
.默认情况下,一个名为 accountsService
的 bean将为您的服务创建(假设它在 grails-app/services/...
下定义)。目前尚不清楚您为什么要定义自己的,但如果您真的想这样做,您可能希望将其配置为自动连接......accounts(AccountsService){ bean ->
bean.autowire = 'byName'
}
accountsService
框架为您创建的 bean 已经按名称配置为 Autowiring 。
关于elasticsearch - 服务被注入(inject),但在使用其属性时导致空指针异常。可能的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55781976/