2011-10-26 25 views
0

我正在使用iReport-4.1.1创建.jasper和.jrxml文件。我的文件在Webcontent/reports以XML作为输入的JasperReports --- Getiing Inputstream空指针异常

下面是我用来从jasper打开PDF的代码。我将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

首先,你应该检查路径一致的报告模板:

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

可能是你应该改变路径/WEB-INF/reports/FUECReport.jasper?您可以尝试在java.io的帮助下检查文件的可用性。

第二,变量reportStream必须包含compiled报告。

javadoc不说这个方法(你可以看到与another signature同样的方法参数),但你可以查看该方法的源代码:

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 

- 填写报告并将其直接发送到PDF格式的OutputStream。中间的JasperPrint对象不保存在磁盘上。

请检查您的数据源 - 准备另一个数据源并将其传递给runReportToPdfStream方法。

您可以使用JRMapArrayDataSourceJRMapArrayDataSource样品使用:

 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); 

如果一切都会好的,在方法的问题,你准备的数据源。

+0

FUECReport.jasper文件位于正确的位置。我将InputStream对象从reportStream更改为reportStream1。我还使用InputStreamReader来检查输入流是否正确。这是正确的,我检查。现在我得到一个异常,net.sf.jasperreports.engine.JRException:从InputStream加载对象时出错........引起:java.io.EOFException – user1015388

+0

我能够克服这个问题,但现在PDF打开(从runReportToPdfStream)所有的值为NULL。我在PDF中看不到任何数据。该列的所有值均为NULL。 – user1015388

+0

你检查参数图吗?你看到静态文本了吗? –