2011-10-19 148 views
1

我想使用依賴注入導出到Excel通過「導出插件」提供的功能 看來whenevery我嘗試在我的項目中使用的服務,我得到錯誤,如以下NullPointerException異常依賴注入

Stacktrace follows: 
java.lang.NullPointerException: Cannot invoke method export() on null object 
    at pm.ProjectsController$_closure2.doCall(ProjectsController.groovy:39) 
    at pm.ProjectsController$_closure2.doCall(ProjectsController.groovy) 
    at java.lang.Thread.run(Thread.java:662) 

我使用的是下面的代碼,這也就意味着服務變量爲空

def exportService// i have tried with and without the initialization 
     if(params?.format && params.format != "html"){ 
      response.contentType = ConfigurationHolder.config.grails.mime.types[params.format] 
      response.setHeader("Content-disposition", "attachment; filename=books.${params.extension}") 

      exportService.export(params.format, response.outputStream,projectsList, [:], [:]) 
     } 

看來,使用服務無插件在我的項目在我的項目例如AsynchronousMailService工作沒工作,因爲它是suppos E要,因此我一直在使用它像以下

AsynchronousMailService asynchronousMailService = new AsynchronousMailService() 
      asynchronousMailService.sendAsynchronousMail {  
       to projectsInstance.projectLead.emailAddress 
       subject "New project is assigned to you" 
       html msg 
      } 

除非我缺少somethig非常基本的我也不敢相信,如果該插件提供相同的服務,我應該被實例化這個類。

感謝

回答

3

沒錯,你應該永遠不會實例化服務或其他的Spring bean - 使用依賴注入。它可能會起作用,但是如果bean有它自己的任何依賴關係,它們將會是null,因爲你繞過了Spring。

您沒有使用依賴注入,你聲明的局部變量和期待的魔力。

依賴注入Grails使用公共字段。由於Groovy將公共字段創建爲getter和setter,所以Spring看到setter和Grails被配置爲按名稱注入,所以只要字段/設置器匹配它工作的Spring bean名稱即可。

所以你的控制器應是這個樣子:

class MyController { 

    def exportService 

    def myAction = { 
     if (params?.format && params.format != "html") { 
     response.contentType = grailsApplication.config.grails.mime.types[params.format] 
     response.setHeader("Content-disposition", 
          "attachment; filename=books.${params.extension}") 

     exportService.export(params.format, 
       response.outputStream,projectsList, [:], [:]) 
     } 
    } 
} 

請注意,我還刪除了使用ConfigurationHolder的,因爲它是不推薦使用。訪問配置的最佳方式是從grailsApplication bean。它已經被注入控制器(和taglibs)中,並且在服務或其他bean中,您只需要一個def grailsApplication字段聲明。

+0

非常感謝。這工作 – Sap