我们使用jsonql作为查询语言和多个子报表级别设计了一个使用json数据的新报表,该报表在Jaspersoft Studio(v6.6.0)中生成的效果很好。
我们需要一些Java代码来获取生成的json数据,并使用服务器上运行Jasper 6.6.0的服务器上预编译的jasper文件创建报告,但是,当我们尝试在Java中生成pdf时,某些子报告会崩溃,说明它找不到要使用的数据,当我们删除那些有问题的子报表时,它会生成一个大空白文件,标题为1或2,并且未显示任何相关信息/表。
InputStream jasperTemplateStream = getReportingTemplate();
JRDataSource jsonDataSource = new JsonQLDataSource(request);
JasperReport jasperReport = (JasperReport) JRLoader.loadObject(jasperTemplateStream);
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, null, jsonDataSource);
JasperExportManager.exportReportToPdfStream(jasperPrint, response);
关于为什么的任何想法?我们的Jaspersoft Studio和Jasper mvn
版本是相同的。
stacktrace如下:
net.sf.jasperreports.engine.JRRuntimeException: net.sf.jasperreports.engine.fill.JRExpressionEvalException: Error evaluating expression for source text: ((net.sf.jasperreports.engine.data.JsonQLDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("assetClasses")
...
Caused by: net.sf.jasperreports.engine.fill.JRExpressionEvalException: Error evaluating expression for source text: ((net.sf.jasperreports.engine.data.JsonQLDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("assetClasses")
...
Caused by: net.sf.jasperreports.engine.JRException: No JSON data to operate on!
答案 0 :(得分:0)
而不是将数据输入流传递给fillReport()方法,而是尝试通过参数映射传递它:
Map<String, Object> params = new HashMap<>();
params.put(JsonQLQueryExecuterFactory.JSON_INPUT_STREAM, request);
JasperReport jasperReport = (JasperReport)
JRLoader.loadObject(jasperTemplateStream);
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params);
JasperExportManager.exportReportToPdfStream(jasperPrint, response);