有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我们使用json数据设计了一个新的报表,其中jsonql作为查询语言,多个子报表级别在Jaspersoft studio(v6.6.0)中生成fine

我们需要一些java代码来获取生成的json数据,并在服务器上使用预编译的jasper文件创建报告,在服务器上运行jasper 6.6.0,但是当我们试图用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) 个答案

  1. # 1 楼答案

    不要将数据输入流传递给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);