我正在尝试使用依赖注入(inject)导出到“导出插件”提供的 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)
我正在使用的代码如下,这只是意味着服务变量为空
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 没有按预期工作,因此我一直在使用它,如下所示
AsynchronousMailService asynchronousMailService = new AsynchronousMailService()
asynchronousMailService.sendAsynchronousMail {
to projectsInstance.projectLead.emailAddress
subject "New project is assigned to you"
html msg
}
除非我遗漏了一些非常基本的东西,否则如果插件提供与服务相同的功能,我不相信我应该实例化这个类。
谢谢
请您参考如下方法:
是的,您永远不应该实例化服务或其他 Spring bean - 使用依赖注入(inject)。它可能会起作用,但是如果 bean 有它自己的任何依赖项,它们将是 null,因为您正在绕过 Spring。
您没有使用依赖注入(inject),而是声明了一个局部变量并期待魔术。
Grails 中的依赖注入(inject)使用公共(public)字段。由于 Groovy 在后台为 getter 和 setter 创建了一个公共(public)字段,因此 Spring 可以看到 setter,并且 Grails 被配置为按名称注入(inject),因此只要字段/setter 与 Spring bean 名称匹配,它就可以工作。
所以你的 Controller 应该是这样的:
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 。它已经注入(inject)到 Controller (和标签库)中,并且在服务或其他 bean 中你只需要一个
def grailsApplication字段声明。




