我正在使用Jasper插件(v 1.5.3)用于Grails(v 1.3.7)。我在服务方法
中编写了以下代码import org.codehaus.groovy.grails.plugins.jasper.JasperExportFormat;
import org.codehaus.groovy.grails.plugins.jasper.JasperReportDef;
import org.apache.commons.io.FileUtils;
class ReportService {
static transactional = true
def jasperService
def generateFormA() {
def reportDef = new JasperReportDef(name:'test.jasper', fileFormat:JasperExportFormat.PDF_FORMAT)
FileUtils.writeByteArrayToFile(new File('C:/test.pdf'), jasperService.generateReport(reportDef).toByteArray())
return
}
}
当我调用Service方法时,我遇到了以下运行时错误 -
无法在null对象上调用方法generateReport()
我已按照plugin页面中的说明注入了jasperService并导入了必需的类。而且,当我调试时,我注意到reportDef正在被正确实例化。
任何人都可以提出任何建议。感谢您的帮助。
答案 0 :(得分:0)
你的语法看起来很好,这应该有效。我会尝试停止应用程序并运行grails clean命令。有时这会有所帮助。
答案 1 :(得分:0)
为了更好地了解幕后的场景,我下载了插件源代码并直接在我的应用程序中使用。事实证明,插件的 JasperService 类使用 dataSource bean。
class JasperService {
boolean transactional = true
javax.sql.DataSource dataSource
.....
private JasperPrint generatePrinter(JasperReportDef reportDef) {
.....
def conn = dataSource.getConnection()
jasperPrint = JasperFillManager.fillReport(resource.inputStream, reportDef.parameters, conn)
.....
}
...........
}
但是,当调用dataSource.getConnection()方法时,dataSource没有被实例化(反过来,抛出空对象错误)。可能这与Grails本身有关,而不是插件。所以我修改了JasperService类的JasperPrint()方法,如下所示,它工作
def dataSource = org.codehaus.groovy.grails.commons.ApplicationHolder.application.mainContext.dataSource
def conn = dataSource.getConnection()