使用Java中的jsonql数据源的Jasper填充报告

时间:2019-01-16 13:00:06

标签: java json jasper-reports

我们使用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!

1 个答案:

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