0

我正在为 Grails (v 1.3.7) 使用 Jasper 插件 (v 1.5.3)。我在服务的方法中编写了以下代码

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 方法时出现以下运行时错误 -

无法在空对象上调用方法 generateReport()

我已经注入了 jasperService 并导入了插件页面中描述的所需类。此外,当我调试时,我注意到 reportDef 正在正确实例化。

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

4

2 回答 2

0

您的语法看起来不错,这应该可以工作。我会尝试停止应用程序并运行 grails clean命令。有时这会有所帮助。

于 2012-05-10T09:26:13.130 回答
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()
于 2012-05-11T05:42:04.350 回答