Grails 带有依赖项注入的NullPointerException

Grails 带有依赖项注入的NullPointerException,grails,dependency-injection,Grails,Dependency Injection,我正在尝试使用依赖项注入来导出“导出插件”提供的excel功能 似乎每当我尝试在我的项目中使用服务时,都会出现如下错误 Stacktrace follows: java.lang.NullPointerException: Cannot invoke method export() on null object at pm.ProjectsController$_closure2.doCall(ProjectsController.groovy:39) at pm.Project

我正在尝试使用依赖项注入来导出“导出插件”提供的excel功能 似乎每当我尝试在我的项目中使用服务时,都会出现如下错误

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)
AsynchronousMailService asynchronousMailService = new AsynchronousMailService()
            asynchronousMailService.sendAsynchronousMail  {    
                to projectsInstance.projectLead.emailAddress
                subject "New project is assigned to you"
                html msg
            }
我使用的代码如下,这只是意味着服务变量为null

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并没有像预期的那样工作,因此我一直像下面那样使用它

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)
AsynchronousMailService asynchronousMailService = new AsynchronousMailService()
            asynchronousMailService.sendAsynchronousMail  {    
                to projectsInstance.projectLead.emailAddress
                subject "New project is assigned to you"
                html msg
            }
除非我缺少一些非常基本的东西,否则我不认为如果插件提供与服务相同的服务,我应该实例化这个类


谢谢

没错,您不应该实例化服务或其他Springbean-使用依赖注入。它可能会工作,但如果bean有自己的依赖项,那么它们将为null,因为您绕过了Spring

您没有使用依赖项注入,而是声明了一个局部变量,并期望有魔力

Grails中的依赖项注入使用公共字段。由于Groovy在引擎盖下的getter和setter中创建了一个公共字段,因此Spring可以看到setter,Grails被配置为按名称注入,因此只要字段/setter与Springbean名称匹配,它就可以工作

因此,您的控制器应如下所示:

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。它已经被注入到控制器(和taglib)中,在服务或其他bean中,您只需要一个
def grailsApplication
字段声明