Grails的Jasper插件:无法在null对象上调用方法generateReport()

时间:2012-05-09 04:42:22

标签: grails jasper-reports

我正在使用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正在被正确实例化。

任何人都可以提出任何建议。感谢您的帮助。

2 个答案:

答案 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()