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メソッドを呼び出すと、次の実行時エラーが発生します-

nullオブジェクトでメソッドgenerateReport()を呼び出すことはできません

プラグインページで説明されているように、jasperServiceを挿入し、必要なクラスをインポートしました。さらに、デバッグすると、reportDefが適切にインスタンス化されていることに気付きました。

誰かが何かを提案できますか?あなたの助けに感謝。

4

2 に答える 2

0

構文は正常に見え、これは機能するはずです。アプリを停止してgrailscleanコマンドを実行してみます。時々これは役に立ちます。

于 2012-05-10T09:26:13.130 に答える
0

マイケル、洞察に感謝します。

カーテンの裏側についてより良いアイデアを得るために、プラグインのソースコードをダウンロードして、アプリケーションで直接使用しました。プラグインのJasperServiceクラスはdataSourceBeanを使用していることがわかりました。

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がインスタンス化されていません(これにより、nullオブジェクトエラーがスローされます)。これは、プラグインではなく、Grails自体に関係している可能性があります。そこで、JasperServiceクラスのJasperPrint()メソッドを以下のように変更しました。

def dataSource = org.codehaus.groovy.grails.commons.ApplicationHolder.application.mainContext.dataSource
def conn = dataSource.getConnection()
于 2012-05-11T05:42:04.350 に答える