JasperReports с XML в качестве входных данных --- Getiing Inputstream исключение нулевого указателя - PullRequest
0 голосов
/ 27 октября 2011

Я использую iReport-4.1.1 для создания файлов .jasper и .jrxml. Мои файлы находятся в Webcontent / reports

Ниже приведен код, который я использую для открытия PDF из jasper. Я передаю XML в качестве ввода.

InputStream reportStream = getServletConfig().getServletContext().getResourceAsStream("/reports/FUECReport.jasper");
JRXmlDataSource xmlDataSource = new JRXmlDataSource(stringToDom(xmlResult));

HashMap parameterMap = new HashMap();
parameterMap.put("TITLE_MSG_PARAM", fUECRptMsg);
parameterMap.put("SURVEY_YEAR_PARAM", surveyYear);              
parameterMap.put("STATE_CODE_PARAM", fipsStateCode);

JasperRunManager.runReportToPdfStream(reportStream,servletOutputStream, parameterMap,xmlDataSource);
response.setContentType("application/pdf");
servletOutputStream.flush();
servletOutputStream.close();

//this is the function that is converting the xmlsource to Document
public static Document stringToDom(String xmlSource)  throws SAXException, ParserConfigurationException, IOException { 
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();  
    DocumentBuilder builder = factory.newDocumentBuilder();
    return builder.parse(new InputSource(new StringReader(xmlSource)));  
} 

При запуске я получаю исключение нулевого указателя в строке:

JasperRunManager.runReportToPdfStream(*reportStream*,servletOutputStream, parameterMap,xmlDataSource);

говоря, что reportStream равен нулю

Кто-нибудь, пожалуйста, дайте мне знать, где проблема.

Когда я запускаю и компилирую из ireport, я успешно могу открыть PDF.

Спасибо

GK

1 Ответ

1 голос
/ 27 октября 2011

Во-первых, вы должны проверить путь к шаблону отчета в строке:

InputStream reportStream = getServletConfig().getServletContext().getResourceAsStream("/reports/FUECReport.jasper");

Может быть, вам следует изменить путь на /WEB-INF/reports/FUECReport.jasper?Вы можете попытаться проверить доступность файла с помощью java.io.

. Во втором случае переменная reportStream должна содержать отчет compiled.

javadoc не говорит этого для этого метода (вы можете прочитать о параметрах для того же метода с другой подписью ), но вы можете просмотреть исходный код этого метода:

runReportToPdfStream

public static void JasperRunManager.runReportToPdfStream(java.io.InputStream inputStream,
                                    java.io.OutputStream outputStream,
                                    java.util.Map<java.lang.String,java.lang.Object> parameters,
                                    JRDataSource jrDataSource)
                             throws JRException
                           throws JRException

- Заполняет отчет и отправляет его непосредственно в OutputStream в формате PDF.Промежуточный объект JasperPrint не сохраняется на диске.

Пожалуйста, проверьте свой источник данных - подготовьте другой источник данных и передайте его методу runReportToPdfStream.

Вы можете использовать JRMapArrayDataSource , образец JRMapArrayDataSourceиспользуя:

        Map<String, Object> params = new HashMap<String, Object>();
        params.put("Title", "Report title");

        Map<String, String> firstRow = new HashMap<String, String>();
        firstRow.put("title", "Greatest Hits");
        firstRow.put("artist", "Dolly Parton");
        firstRow.put("country", "USA");
        firstRow.put("company", "RCA");
        firstRow.put("price", "9.90");
        firstRow.put("year", "1982");

        Map<String, String> secondRow = new HashMap<String, String>();
        secondRow.put("title", "Still got the blues");
        secondRow.put("artist", "Gary Moore");
        secondRow.put("country", "UK");
        secondRow.put("company", "Virgin records");
        secondRow.put("price", "10.20");
        secondRow.put("year", "1990");

        Object[] data = {firstRow, secondRow};

        JRMapArrayDataSource dataSource = new JRMapArrayDataSource(data);

        JasperReport jasperReport = JasperCompileManager.compileReport(reportSource);
        JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params, dataSource);

        JasperExportManager.exportReportToPdfFile(jasperPrint, targetFileName);

Если все будет хорошо, проблема в методе, который вы готовите dataSource.

...