Плагин Jasper Report для создания PDF-файлов в Grails 2.4.2

Я использую плагин отчета jasper в Grails 2.2.4 для создания файла PDF. Мой код для контроллера:

import org.codehaus.groovy.grails.plugins.jasper.JasperExportFormat
import org.codehaus.groovy.grails.plugins.jasper.JasperReportDef

class LabController {
    def jasperService
    def directpdf() {

        def reportDef = new JasperReportDef(name:'mbarang.jrxml', fileFormat:JasperExportFormat.PDF_FORMAT)

        response.contentType = 'application/pdf'
        response.outputStream << jasperService.generateReport(reportDef).toByteArray()


        return(false);
    }
}

Этот код работает правильно в Grails 2.2.4. Но когда я запускаю Grails 2.4.2, я получаю эту ошибку:

Error 500: Internal Server Error
Message
getOutputStream() has already been called for this response

почему я получил эту ошибку?


person Julius Prayogo    schedule 16.07.2014    source источник


Ответы (3)


Есть несколько вещей, которые вы должны сделать, чтобы избежать проблем с потоком ответа/вывода.

Во-первых, вы должны рассмотреть возможность очистки выходного потока:

response.outputStream.flush()

Во-вторых, вы должны закрыть поток вывода:

response.outputStream.close()

Наконец, вы должны вернуть null, чтобы указать Grails, что вы не хотите отображать представление.

return null

Вышеупомянутые изменения обеспечат правильную обработку вашего выходного потока в вашем методе контроллера.

person Joshua Moore    schedule 16.07.2014
comment
Спасибо за Ваш ответ. Но почему этот код может правильно работать на Grails 2.2.4? После отладки проблема связана с плагинами, jasperService не может вызвать метод generateReport - person Julius Prayogo; 17.07.2014

Я изменил способ отправки byteArray. Я использую метод render, поэтому он стал:

render(file: jasperService.generateReport(reportDef).toByteArray(), contentType: 'application/pdf')

Но я получил другую ошибку:

Error 500: Internal Server Error Class java.lang.ClassNotFoundException Message org.apache.commons.collections.ReferenceMap

Я думаю, что это проблема с плагинами, я думаю, что плагин jasper несовместим с Grails 2.4.2. Я решил использовать библиотеку jasper напрямую. Скопируйте нужный .jar в папку lib/. Я загружаю этот .jar:

commons-beanutils-1.9.2.jar commons-collections-3.2.jar commons-digester-2.1.jar commons-logging-1.2.jar itext-2.1.7.jar jasperreports-5.6.0.jar

Затем измените мой контроллер на что-то вроде этого:

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporter;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.export.JRPdfExporter;

class LaporanController {
    def printbarang() {
        try {
            String reportName = "c:/xampp/halo"
            // compiles jrxml
            JasperCompileManager.compileReportToFile(reportName + ".jrxml");
            // fills compiled report with parameters and a connection
            // JasperPrint print = JasperFillManager.fillReport(reportName + ".jasper", parameters, connection);
            JasperPrint print = JasperFillManager.fillReport(reportName + ".jasper", null);
            ByteArrayOutputStream  pdfStream = new ByteArrayOutputStream();
            // exports report to pdf
            JRExporter exporter = new JRPdfExporter();
            exporter.setParameter(JRExporterParameter.JASPER_PRINT, print);
            // exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, new FileOutputStream(reportName + ".pdf")); // your output goes here
            exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, pdfStream); // your output goes here
            exporter.exportReport();
        } catch (Exception e) {
            render('something when wrong')
            throw new RuntimeException("It's not possible to generate the pdf report.", e); 
        } finally {
            render(file: pdfStream.toByteArray(), contentType: 'application/pdf')
        }
    }
}
person Julius Prayogo    schedule 18.07.2014
comment
У меня была похожая проблема, когда я перешел с grails 2.3.11 на 2.4.3. Я попробовал оператор рендеринга и получил сообщение об ошибке, что org.apache.commons.beanutils.MethodUtils не определен. Итак, я добавил зависимость от commons-beanutils (commons-beanutils:commons-beanutils:1.9.2), и это сработало. У меня уже была зависимость от общих коллекций, что, вероятно, вам нужно для устранения ошибки, которую вы получили, когда использовали оператор рендеринга. - person Nathan Ward; 22.10.2014

Это исправлено в 1.11.0-SNAPSHOT:

https://jira.grails.org/browse/GPJASPER-73

person Ingo Kegel    schedule 23.01.2015